gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/0000755000175600017570000000000012672631600020611 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/GITLAB_SHELL_VERSION0000644000175600017570000000000712672631600023627 0ustar pravipravi2.6.10 gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/0000755000175600017570000000000012672631600021371 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/0000755000175600017570000000000012672631600023541 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/namespace_validator.rb0000644000175600017570000000155412672631600030074 0ustar pravipravi# NamespaceValidator # # Custom validator for GitLab namespace values. # # Values are checked for formatting and exclusion from a list of reserved path # names. class NamespaceValidator < ActiveModel::EachValidator RESERVED = %w( admin all assets ci dashboard files groups help hooks issues merge_requests new notes profile projects public repository s search services snippets teams u unsubscribes users ).freeze def validate_each(record, attribute, value) unless value =~ Gitlab::Regex.namespace_regex record.errors.add(attribute, Gitlab::Regex.namespace_regex_message) end if reserved?(value) record.errors.add(attribute, "#{value} is a reserved name") end end private def reserved?(value) RESERVED.include?(value) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/namespace_name_validator.rb0000644000175600017570000000052112672631600031065 0ustar pravipravi# NamespaceNameValidator # # Custom validator for GitLab namespace name strings. class NamespaceNameValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value =~ Gitlab::Regex.namespace_name_regex record.errors.add(attribute, Gitlab::Regex.namespace_name_regex_message) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/line_code_validator.rb0000644000175600017570000000047512672631600030062 0ustar pravipravi# LineCodeValidator # # Custom validator for GitLab line codes. class LineCodeValidator < ActiveModel::EachValidator PATTERN = /\A[a-z0-9]+_\d+_\d+\z/.freeze def validate_each(record, attribute, value) unless value =~ PATTERN record.errors.add(attribute, "must be a valid line code") end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/color_validator.rb0000644000175600017570000000102412672631600027246 0ustar pravipravi# ColorValidator # # Custom validator for web color codes. It requires the leading hash symbol and # will accept RGB triplet or hexadecimal formats. # # Example: # # class User < ActiveRecord::Base # validates :background_color, allow_blank: true, color: true # end # class ColorValidator < ActiveModel::EachValidator PATTERN = /\A\#[0-9A-Fa-f]{3}{1,2}+\Z/.freeze def validate_each(record, attribute, value) unless value =~ PATTERN record.errors.add(attribute, "must be a valid color code") end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/url_validator.rb0000644000175600017570000000152012672631600026733 0ustar pravipravi# UrlValidator # # Custom validator for URLs. # # By default, only URLs for the HTTP(S) protocols will be considered valid. # Provide a `:protocols` option to configure accepted protocols. # # Example: # # class User < ActiveRecord::Base # validates :personal_url, url: true # # validates :ftp_url, url: { protocols: %w(ftp) } # # validates :git_url, url: { protocols: %w(http https ssh git) } # end # class UrlValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless valid_url?(value) record.errors.add(attribute, "must be a valid URL") end end private def default_options @default_options ||= { protocols: %w(http https) } end def valid_url?(value) options = default_options.merge(self.options) value =~ /\A#{URI.regexp(options[:protocols])}\z/ end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/validators/email_validator.rb0000644000175600017570000000027112672631600027222 0ustar pravipraviclass EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) record.errors.add(attribute, :invalid) unless value =~ Devise.email_regexp end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/0000755000175600017570000000000012672631600023025 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/devise_mailer.rb0000644000175600017570000000030212672631600026155 0ustar pravipraviclass DeviseMailer < Devise::Mailer default from: "#{Gitlab.config.gitlab.email_display_name} <#{Gitlab.config.gitlab.email_from}>" default reply_to: Gitlab.config.gitlab.email_reply_to end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/base_mailer.rb0000644000175600017570000000141312672631600025614 0ustar pravipraviclass BaseMailer < ActionMailer::Base add_template_helper ApplicationHelper add_template_helper GitlabMarkdownHelper attr_accessor :current_user helper_method :current_user, :can? default from: Proc.new { default_sender_address.format } default reply_to: Proc.new { default_reply_to_address.format } def can? Ability.abilities.allowed?(current_user, action, subject) end private def default_sender_address address = Mail::Address.new(Gitlab.config.gitlab.email_from) address.display_name = Gitlab.config.gitlab.email_display_name address end def default_reply_to_address address = Mail::Address.new(Gitlab.config.gitlab.email_reply_to) address.display_name = Gitlab.config.gitlab.email_display_name address end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/email_rejection_mailer.rb0000644000175600017570000000115712672631600030040 0ustar pravipraviclass EmailRejectionMailer < BaseMailer def rejection(reason, original_raw, can_retry = false) @reason = reason @original_message = Mail::Message.new(original_raw) return unless @original_message.from headers = { to: @original_message.from, subject: "[Rejected] #{@original_message.subject}" } headers['Message-ID'] = "<#{SecureRandom.hex}@#{Gitlab.config.gitlab.host}>" headers['In-Reply-To'] = @original_message.message_id headers['References'] = @original_message.message_id headers['Reply-To'] = @original_message.to.first if can_retry mail(headers) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/notify.rb0000644000175600017570000001113112672631600024657 0ustar pravipraviclass Notify < BaseMailer include ActionDispatch::Routing::PolymorphicRoutes include Emails::Issues include Emails::MergeRequests include Emails::Notes include Emails::Projects include Emails::Profile include Emails::Groups include Emails::Builds add_template_helper MergeRequestsHelper add_template_helper EmailsHelper def test_email(recipient_email, subject, body) mail(to: recipient_email, subject: subject, body: body.html_safe, content_type: 'text/html' ) end # Splits "gitlab.corp.company.com" up into "gitlab.corp.company.com", # "corp.company.com" and "company.com". # Respects set tld length so "company.co.uk" won't match "somethingelse.uk" def self.allowed_email_domains domain_parts = Gitlab.config.gitlab.host.split(".") allowed_domains = [] begin allowed_domains << domain_parts.join(".") domain_parts.shift end while domain_parts.length > ActionDispatch::Http::URL.tld_length allowed_domains end def can_send_from_user_email?(sender) sender_domain = sender.email.split("@").last self.class.allowed_email_domains.include?(sender_domain) end private # Return an email address that displays the name of the sender. # Only the displayed name changes; the actual email address is always the same. def sender(sender_id, send_from_user_email = false) return unless sender = User.find(sender_id) address = default_sender_address address.display_name = sender.name if send_from_user_email && can_send_from_user_email?(sender) address.address = sender.email end address.format end # Look up a User by their ID and return their email address # # recipient_id - User ID # # Returns a String containing the User's email address. def recipient(recipient_id) @current_user = User.find(recipient_id) @current_user.notification_email end # Formats arguments into a String suitable for use as an email subject # # extra - Extra Strings to be inserted into the subject # # Examples # # >> subject('Lorem ipsum') # => "Lorem ipsum" # # # Automatically inserts Project name when @project is set # >> @project = Project.last # => # # >> subject('Lorem ipsum') # => "Ruby on Rails | Lorem ipsum " # # # Accepts multiple arguments # >> subject('Lorem ipsum', 'Dolor sit amet') # => "Lorem ipsum | Dolor sit amet" def subject(*extra) subject = "" subject << "#{@project.name} | " if @project subject << extra.join(' | ') if extra.present? subject end # Return a string suitable for inclusion in the 'Message-Id' mail header. # # The message-id is generated from the unique URL to a model object. def message_id(model) model_name = model.class.model_name.singular_route_key "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>" end def mail_thread(model, headers = {}) add_project_headers headers["X-GitLab-#{model.class.name}-ID"] = model.id headers['X-GitLab-Reply-Key'] = reply_key if Gitlab::IncomingEmail.enabled? address = Mail::Address.new(Gitlab::IncomingEmail.reply_address(reply_key)) address.display_name = @project.name_with_namespace headers['Reply-To'] = address @reply_by_email = true end mail(headers) end # Send an email that starts a new conversation thread, # with headers suitable for grouping by thread in email clients. # # See: mail_answer_thread def mail_new_thread(model, headers = {}) headers['Message-ID'] = message_id(model) mail_thread(model, headers) end # Send an email that responds to an existing conversation thread, # with headers suitable for grouping by thread in email clients. # # For grouping emails by thread, email clients heuristics require the answers to: # # * have a subject that begin by 'Re: ' # * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID' # def mail_answer_thread(model, headers = {}) headers['Message-ID'] = "<#{SecureRandom.hex}@#{Gitlab.config.gitlab.host}>" headers['In-Reply-To'] = message_id(model) headers['References'] = message_id(model) headers[:subject].prepend('Re: ') if headers[:subject] mail_thread(model, headers) end def reply_key @reply_key ||= SentNotification.reply_key end def add_project_headers return unless @project headers['X-GitLab-Project'] = @project.name headers['X-GitLab-Project-Id'] = @project.id headers['X-GitLab-Project-Path'] = @project.path_with_namespace end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/0000755000175600017570000000000012672631600024277 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/builds.rb0000644000175600017570000000143312672631600026107 0ustar pravipravimodule Emails module Builds def build_fail_email(build_id, to) @build = Ci::Build.find(build_id) @project = @build.project add_project_headers add_build_headers('failed') mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha)) end def build_success_email(build_id, to) @build = Ci::Build.find(build_id) @project = @build.project add_project_headers add_build_headers('success') mail(to: to, subject: subject("Build success for #{@project.name}", @build.short_sha)) end private def add_build_headers(status) headers['X-GitLab-Build-Id'] = @build.id headers['X-GitLab-Build-Ref'] = @build.ref headers['X-GitLab-Build-Status'] = status.to_s end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/issues.rb0000644000175600017570000000317212672631600026142 0ustar pravipravimodule Emails module Issues def new_issue_email(recipient_id, issue_id) setup_issue_mail(issue_id, recipient_id) mail_new_thread(@issue, issue_thread_options(@issue.author_id, recipient_id)) end def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id) setup_issue_mail(issue_id, recipient_id) @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id mail_answer_thread(@issue, issue_thread_options(updated_by_user_id, recipient_id)) end def closed_issue_email(recipient_id, issue_id, updated_by_user_id) setup_issue_mail(issue_id, recipient_id) @updated_by = User.find updated_by_user_id mail_answer_thread(@issue, issue_thread_options(updated_by_user_id, recipient_id)) end def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) setup_issue_mail(issue_id, recipient_id) @issue_status = status @updated_by = User.find updated_by_user_id mail_answer_thread(@issue, issue_thread_options(updated_by_user_id, recipient_id)) end private def issue_thread_options(sender_id, recipient_id) { from: sender(sender_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})") } end def setup_issue_mail(issue_id, recipient_id) @issue = Issue.find(issue_id) @project = @issue.project @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) @sent_notification = SentNotification.record(@issue, recipient_id, reply_key) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/notes.rb0000644000175600017570000000313012672631600025751 0ustar pravipravimodule Emails module Notes def note_commit_email(recipient_id, note_id) setup_note_mail(note_id, recipient_id) @commit = @note.noteable @target_url = namespace_project_commit_url(*note_target_url_options) mail_answer_thread(@commit, from: sender(@note.author_id), to: recipient(recipient_id), subject: subject("#{@commit.title} (#{@commit.short_id})")) end def note_issue_email(recipient_id, note_id) setup_note_mail(note_id, recipient_id) @issue = @note.noteable @target_url = namespace_project_issue_url(*note_target_url_options) mail_answer_thread(@issue, note_thread_options(recipient_id)) end def note_merge_request_email(recipient_id, note_id) setup_note_mail(note_id, recipient_id) @merge_request = @note.noteable @target_url = namespace_project_merge_request_url(*note_target_url_options) mail_answer_thread(@merge_request, note_thread_options(recipient_id)) end private def note_target_url_options [@project.namespace, @project, @note.noteable, anchor: "note_#{@note.id}"] end def note_thread_options(recipient_id) { from: sender(@note.author_id), to: recipient(recipient_id), subject: subject("#{@note.noteable.title} (##{@note.noteable.iid})") } end def setup_note_mail(note_id, recipient_id) @note = Note.find(note_id) @project = @note.project @sent_notification = SentNotification.record_note(@note, recipient_id, reply_key) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/profile.rb0000644000175600017570000000135612672631600026271 0ustar pravipravimodule Emails module Profile def new_user_email(user_id, token = nil) @current_user = @user = User.find(user_id) @target_url = user_url(@user) @token = token mail(to: @user.notification_email, subject: subject("Account was created for you")) end def new_email_email(email_id) @email = Email.find(email_id) @current_user = @user = @email.user mail(to: @user.notification_email, subject: subject("Email was added to your account")) end def new_ssh_key_email(key_id) @key = Key.find(key_id) @current_user = @user = @key.user @target_url = user_url(@user) mail(to: @user.notification_email, subject: subject("SSH key was added to your account")) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/projects.rb0000644000175600017570000000536212672631600026463 0ustar pravipravimodule Emails module Projects def project_access_granted_email(project_member_id) @project_member = ProjectMember.find project_member_id @project = @project_member.project @target_url = namespace_project_url(@project.namespace, @project) @current_user = @project_member.user mail(to: @project_member.user.notification_email, subject: subject("Access to project was granted")) end def project_member_invited_email(project_member_id, token) @project_member = ProjectMember.find project_member_id @project = @project_member.project @token = token @target_url = namespace_project_url(@project.namespace, @project) @current_user = @project_member.user mail(to: @project_member.invite_email, subject: "Invitation to join project #{@project.name_with_namespace}") end def project_invite_accepted_email(project_member_id) @project_member = ProjectMember.find project_member_id return if @project_member.created_by.nil? @project = @project_member.project @target_url = namespace_project_url(@project.namespace, @project) @current_user = @project_member.created_by mail(to: @project_member.created_by.notification_email, subject: subject("Invitation accepted")) end def project_invite_declined_email(project_id, invite_email, access_level, created_by_id) return if created_by_id.nil? @project = Project.find(project_id) @current_user = @created_by = User.find(created_by_id) @access_level = access_level @invite_email = invite_email @target_url = namespace_project_url(@project.namespace, @project) mail(to: @created_by.notification_email, subject: subject("Invitation declined")) end def project_was_moved_email(project_id, user_id, old_path_with_namespace) @current_user = @user = User.find user_id @project = Project.find project_id @target_url = namespace_project_url(@project.namespace, @project) @old_path_with_namespace = old_path_with_namespace mail(to: @user.notification_email, subject: subject("Project was moved")) end def repository_push_email(project_id, recipient, opts = {}) @message = Gitlab::Email::Message::RepositoryPush.new(self, project_id, recipient, opts) # used in notify layout @target_url = @message.target_url @project = Project.find project_id add_project_headers headers['X-GitLab-Author'] = @message.author_username mail(from: sender(@message.author_id, @message.send_from_committer_email?), reply_to: @message.reply_to, to: @message.recipient, subject: @message.subject) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/groups.rb0000644000175600017570000000307312672631600026146 0ustar pravipravimodule Emails module Groups def group_access_granted_email(group_member_id) @group_member = GroupMember.find(group_member_id) @group = @group_member.group @target_url = group_url(@group) @current_user = @group_member.user mail(to: @group_member.user.notification_email, subject: subject("Access to group was granted")) end def group_member_invited_email(group_member_id, token) @group_member = GroupMember.find group_member_id @group = @group_member.group @token = token @target_url = group_url(@group) @current_user = @group_member.user mail(to: @group_member.invite_email, subject: "Invitation to join group #{@group.name}") end def group_invite_accepted_email(group_member_id) @group_member = GroupMember.find group_member_id return if @group_member.created_by.nil? @group = @group_member.group @target_url = group_url(@group) @current_user = @group_member.created_by mail(to: @group_member.created_by.notification_email, subject: subject("Invitation accepted")) end def group_invite_declined_email(group_id, invite_email, access_level, created_by_id) return if created_by_id.nil? @group = Group.find(group_id) @current_user = @created_by = User.find(created_by_id) @access_level = access_level @invite_email = invite_email @target_url = group_url(@group) mail(to: @created_by.notification_email, subject: subject("Invitation declined")) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/emails/merge_requests.rb0000644000175600017570000000536312672631600027665 0ustar pravipravimodule Emails module MergeRequests def new_merge_request_email(recipient_id, merge_request_id) setup_merge_request_mail(merge_request_id, recipient_id) mail_new_thread(@merge_request, from: sender(@merge_request.author_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id) setup_merge_request_mail(merge_request_id, recipient_id) @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) setup_merge_request_mail(merge_request_id, recipient_id) @updated_by = User.find updated_by_user_id mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) setup_merge_request_mail(merge_request_id, recipient_id) mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def merge_request_status_email(recipient_id, merge_request_id, status, updated_by_user_id) setup_merge_request_mail(merge_request_id, recipient_id) @mr_status = status @updated_by = User.find updated_by_user_id mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end private def setup_merge_request_mail(merge_request_id, recipient_id) @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project @target_url = namespace_project_merge_request_url(@project.namespace, @project, @merge_request) @sent_notification = SentNotification.record(@merge_request, recipient_id, reply_key) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/abuse_report_mailer.rb0000644000175600017570000000075312672631600027402 0ustar pravipraviclass AbuseReportMailer < BaseMailer include Gitlab::CurrentSettings def notify(abuse_report_id) return unless deliverable? @abuse_report = AbuseReport.find(abuse_report_id) mail( to: current_application_settings.admin_notification_email, subject: "#{@abuse_report.user.name} (#{@abuse_report.user.username}) was reported for abuse" ) end private def deliverable? current_application_settings.admin_notification_email.present? end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/mailers/.gitkeep0000644000175600017570000000000012672631600024444 0ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/0000755000175600017570000000000012672631600023214 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/gravatar_service.rb0000644000175600017570000000115012672631600027065 0ustar pravipraviclass GravatarService include Gitlab::CurrentSettings def execute(email, size = nil, scale = 2) if current_application_settings.gravatar_enabled? && email.present? size = 40 if size.nil? || size <= 0 sprintf gravatar_url, hash: Digest::MD5.hexdigest(email.strip.downcase), size: size * scale, email: email.strip end end def gitlab_config Gitlab.config.gitlab end def gravatar_config Gitlab.config.gravatar end def gravatar_url if gitlab_config.https gravatar_config.ssl_url else gravatar_config.plain_url end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/git_push_service.rb0000644000175600017570000001230212672631600027101 0ustar pravipraviclass GitPushService < BaseService attr_accessor :push_data, :push_commits include Gitlab::CurrentSettings include Gitlab::Access # This method will be called after each git update # and only if the provided user and project are present in GitLab. # # All callbacks for post receive action should be placed here. # # Next, this method: # 1. Creates the push event # 2. Updates merge requests # 3. Recognizes cross-references from commit messages # 4. Executes the project's web hooks # 5. Executes the project's services # def execute @project.repository.expire_cache(branch_name) if push_remove_branch? @project.repository.expire_has_visible_content_cache @push_commits = [] elsif push_to_new_branch? @project.repository.expire_has_visible_content_cache # Re-find the pushed commits. if is_default_branch? # Initial push to the default branch. Take the full history of that branch as "newly pushed". process_default_branch else # Use the pushed commits that aren't reachable by the default branch # as a heuristic. This may include more commits than are actually pushed, but # that shouldn't matter because we check for existing cross-references later. @push_commits = @project.repository.commits_between(@project.default_branch, params[:newrev]) # don't process commits for the initial push to the default branch process_commit_messages end elsif push_to_existing_branch? # Collect data for this git push @push_commits = @project.repository.commits_between(params[:oldrev], params[:newrev]) process_commit_messages end # Update merge requests that may be affected by this push. A new branch # could cause the last commit of a merge request to change. update_merge_requests end protected def update_merge_requests @project.update_merge_requests(params[:oldrev], params[:newrev], params[:ref], current_user) EventCreateService.new.push(@project, current_user, build_push_data) @project.execute_hooks(build_push_data.dup, :push_hooks) @project.execute_services(build_push_data.dup, :push_hooks) CreateCommitBuildsService.new.execute(@project, current_user, build_push_data) ProjectCacheWorker.perform_async(@project.id) end def process_default_branch @push_commits = project.repository.commits(params[:newrev]) # Ensure HEAD points to the default branch in case it is not master project.change_head(branch_name) # Set protection on the default branch if configured if (current_application_settings.default_branch_protection != PROTECTION_NONE) developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false @project.protected_branches.create({ name: @project.default_branch, developers_can_push: developers_can_push }) end end # Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched, # close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables. def process_commit_messages is_default_branch = is_default_branch? authors = Hash.new do |hash, commit| email = commit.author_email next hash[email] if hash.has_key?(email) hash[email] = commit_user(commit) end @push_commits.each do |commit| # Keep track of the issues that will be actually closed because they are on a default branch. # Hence, when creating cross-reference notes, the not-closed issues (on non-default branches) # will also have cross-reference. closed_issues = [] if is_default_branch # Close issues if these commits were pushed to the project's default branch and the commit message matches the # closing regex. Exclude any mentioned Issues from cross-referencing even if the commits are being pushed to # a different branch. closed_issues = commit.closes_issues(current_user) closed_issues.each do |issue| Issues::CloseService.new(project, authors[commit], {}).execute(issue, commit) end end commit.create_cross_references!(authors[commit], closed_issues) end end def build_push_data @push_data ||= Gitlab::PushDataBuilder. build(@project, current_user, params[:oldrev], params[:newrev], params[:ref], push_commits) end def push_to_existing_branch? # Return if this is not a push to a branch (e.g. new commits) Gitlab::Git.branch_ref?(params[:ref]) && !Gitlab::Git.blank_ref?(params[:oldrev]) end def push_to_new_branch? Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:oldrev]) end def push_remove_branch? Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:newrev]) end def push_to_branch? Gitlab::Git.branch_ref?(params[:ref]) end def is_default_branch? Gitlab::Git.branch_ref?(params[:ref]) && (Gitlab::Git.ref_name(params[:ref]) == project.default_branch || project.default_branch.nil?) end def commit_user(commit) commit.author || current_user end def branch_name @branch_name ||= Gitlab::Git.ref_name(params[:ref]) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_commit_builds_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_commit_builds_service.0000644000175600017570000000167612672631600031124 0ustar pravipraviclass CreateCommitBuildsService def execute(project, user, params) return false unless project.builds_enabled? sha = params[:checkout_sha] || params[:after] origin_ref = params[:ref] unless origin_ref && sha.present? return false end ref = Gitlab::Git.ref_name(origin_ref) # Skip branch removal if sha == Gitlab::Git::BLANK_SHA return false end commit = project.ci_commit(sha) unless commit commit = project.ci_commits.new(sha: sha) # Skip creating ci_commit when no gitlab-ci.yml is found unless commit.ci_yaml_file return false end # Create a new ci_commit commit.save! end # Skip creating builds for commits that have [ci skip] unless commit.skip_ci? # Create builds for commit tag = Gitlab::Git.tag_ref?(origin_ref) commit.update_committed! commit.create_builds(ref, tag, user) end commit end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/delete_user_service.rb0000644000175600017570000000115312672631600027561 0ustar pravipraviclass DeleteUserService attr_accessor :current_user def initialize(current_user) @current_user = current_user end def execute(user) if user.solo_owned_groups.present? user.errors[:base] << 'You must transfer ownership or delete groups before you can remove user' user else user.personal_projects.each do |project| # Skip repository removal because we remove directory with namespace # that contain all this repositories ::Projects::DestroyService.new(project, current_user, skip_repo: true).pending_delete! end user.destroy end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/system_hooks_service.rb0000644000175600017570000000626212672631600030016 0ustar pravipraviclass SystemHooksService def execute_hooks_for(model, event) execute_hooks(build_event_data(model, event)) end private def execute_hooks(data) SystemHook.all.each do |sh| async_execute_hook(sh, data, 'system_hooks') end end def async_execute_hook(hook, data, hook_name) Sidekiq::Client.enqueue(SystemHookWorker, hook.id, data, hook_name) end def build_event_data(model, event) data = { event_name: build_event_name(model, event), created_at: model.created_at.xmlschema, updated_at: model.updated_at.xmlschema } case model when Key data.merge!( key: model.key, id: model.id ) if model.user data.merge!( username: model.user.username ) end when Project data.merge!(project_data(model)) if event == :rename || event == :transfer data.merge!({ old_path_with_namespace: model.old_path_with_namespace }) end data when User data.merge!({ name: model.name, email: model.email, user_id: model.id, username: model.username }) when ProjectMember data.merge!(project_member_data(model)) when Group owner = model.owner data.merge!( name: model.name, path: model.path, group_id: model.id, owner_name: owner.respond_to?(:name) ? owner.name : nil, owner_email: owner.respond_to?(:email) ? owner.email : nil, ) when GroupMember data.merge!(group_member_data(model)) end end def build_event_name(model, event) case model when ProjectMember return "user_add_to_team" if event == :create return "user_remove_from_team" if event == :destroy when GroupMember return 'user_add_to_group' if event == :create return 'user_remove_from_group' if event == :destroy else "#{model.class.name.downcase}_#{event.to_s}" end end def project_data(model) owner = model.owner { name: model.name, path: model.path, path_with_namespace: model.path_with_namespace, project_id: model.id, owner_name: owner.name, owner_email: owner.respond_to?(:email) ? owner.email : "", project_visibility: Project.visibility_levels.key(model.visibility_level_field).downcase } end def project_member_data(model) { project_name: model.project.name, project_path: model.project.path, project_path_with_namespace: model.project.path_with_namespace, project_id: model.project.id, user_username: model.user.username, user_name: model.user.name, user_email: model.user.email, user_id: model.user.id, access_level: model.human_access, project_visibility: Project.visibility_levels.key(model.project.visibility_level_field).downcase } end def group_member_data(model) { group_name: model.group.name, group_path: model.group.path, group_id: model.group.id, user_username: model.user.username, user_name: model.user.name, user_email: model.user.email, user_id: model.user.id, group_access: model.human_access, } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/test_hook_service.rb0000644000175600017570000000026312672631600027261 0ustar pravipraviclass TestHookService def execute(hook, current_user) data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user) hook.execute(data, 'push_hooks') end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/0000755000175600017570000000000012672631600026246 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/refresh_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/refresh_servic0000644000175600017570000001303112672631600031200 0ustar pravipravimodule MergeRequests class RefreshService < MergeRequests::BaseService def execute(oldrev, newrev, ref) return true unless Gitlab::Git.branch_ref?(ref) @oldrev, @newrev = oldrev, newrev @branch_name = Gitlab::Git.ref_name(ref) find_new_commits # Be sure to close outstanding MRs before reloading them to avoid generating an # empty diff during a manual merge close_merge_requests reload_merge_requests reset_merge_when_build_succeeds # Leave a system note if a branch was deleted/added if branch_added? || branch_removed? comment_mr_branch_presence_changed end comment_mr_with_commits execute_mr_web_hooks true end private # Collect open merge requests that target same branch we push into # and close if push to master include last commit from merge request # We need this to close(as merged) merge requests that were merged into # target branch manually def close_merge_requests commit_ids = @commits.map(&:id) merge_requests = @project.merge_requests.opened.where(target_branch: @branch_name).to_a merge_requests = merge_requests.select(&:last_commit) merge_requests = merge_requests.select do |merge_request| commit_ids.include?(merge_request.last_commit.id) end merge_requests.uniq.select(&:source_project).each do |merge_request| MergeRequests::PostMergeService. new(merge_request.target_project, @current_user). execute(merge_request) end end def force_push? Gitlab::ForcePushCheck.force_push?(@project, @oldrev, @newrev) end # Refresh merge request diff if we push to source or target branch of merge request # Note: we should update merge requests from forks too def reload_merge_requests merge_requests = @project.merge_requests.opened.by_branch(@branch_name).to_a merge_requests += fork_merge_requests.by_branch(@branch_name).to_a merge_requests = filter_merge_requests(merge_requests) merge_requests.each do |merge_request| if merge_request.source_branch == @branch_name || force_push? merge_request.reload_code merge_request.mark_as_unchecked else mr_commit_ids = merge_request.commits.map(&:id) push_commit_ids = @commits.map(&:id) matches = mr_commit_ids & push_commit_ids if matches.any? merge_request.reload_code merge_request.mark_as_unchecked else merge_request.mark_as_unchecked end end end end def reset_merge_when_build_succeeds merge_requests_for_source_branch.each(&:reset_merge_when_build_succeeds) end def find_new_commits if branch_added? @commits = [] merge_request = merge_requests_for_source_branch.first return unless merge_request last_commit = merge_request.last_commit begin # Since any number of commits could have been made to the restored branch, # find the common root to see what has been added. common_ref = @project.repository.merge_base(last_commit.id, @newrev) # If the a commit no longer exists in this repo, gitlab_git throws # a Rugged::OdbError. This is fixed in https://gitlab.com/gitlab-org/gitlab_git/merge_requests/52 @commits = @project.repository.commits_between(common_ref, @newrev) if common_ref rescue end elsif branch_removed? # No commits for a deleted branch. @commits = [] else @commits = @project.repository.commits_between(@oldrev, @newrev) end end # Add comment about branches being deleted or added to merge requests def comment_mr_branch_presence_changed presence = branch_added? ? :add : :delete merge_requests_for_source_branch.each do |merge_request| SystemNoteService.change_branch_presence( merge_request, merge_request.project, @current_user, :source, @branch_name, presence) end end # Add comment about pushing new commits to merge requests def comment_mr_with_commits return unless @commits.present? merge_requests_for_source_branch.each do |merge_request| mr_commit_ids = Set.new(merge_request.commits.map(&:id)) new_commits, existing_commits = @commits.partition do |commit| mr_commit_ids.include?(commit.id) end SystemNoteService.add_commits(merge_request, merge_request.project, @current_user, new_commits, existing_commits, @oldrev) end end # Call merge request webhook with update branches def execute_mr_web_hooks merge_requests_for_source_branch.each do |merge_request| execute_hooks(merge_request, 'update') end end def filter_merge_requests(merge_requests) merge_requests.uniq.select(&:source_project) end def merge_requests_for_source_branch @source_merge_requests ||= begin merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a merge_requests += fork_merge_requests.where(source_branch: @branch_name).to_a filter_merge_requests(merge_requests) end end def fork_merge_requests @fork_merge_requests ||= @project.fork_merge_requests.opened end def branch_added? Gitlab::Git.blank_ref?(@oldrev) end def branch_removed? Gitlab::Git.blank_ref?(@newrev) end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/reopen_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/reopen_service0000644000175600017570000000072312672631600031203 0ustar pravipravimodule MergeRequests class ReopenService < MergeRequests::BaseService def execute(merge_request) if merge_request.reopen event_service.reopen_mr(merge_request, current_user) create_note(merge_request) notification_service.reopen_mr(merge_request, current_user) execute_hooks(merge_request, 'reopen') merge_request.reload_code merge_request.mark_as_unchecked end merge_request end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/build_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/build_service.0000644000175600017570000000463412672631600031075 0ustar pravipravimodule MergeRequests class BuildService < MergeRequests::BaseService def execute merge_request = MergeRequest.new(params) # Set MR attributes merge_request.can_be_created = false merge_request.compare_failed = false merge_request.compare_commits = [] merge_request.compare_diffs = [] merge_request.source_project = project unless merge_request.source_project merge_request.target_project ||= (project.forked_from_project || project) merge_request.target_branch ||= merge_request.target_project.default_branch if merge_request.target_branch.blank? || merge_request.source_branch.blank? message = if params[:source_branch] || params[:target_branch] "You must select source and target branch" end return build_failed(merge_request, message) end compare_result = CompareService.new.execute( merge_request.source_project, merge_request.source_branch, merge_request.target_project, merge_request.target_branch, ) commits = compare_result.commits # At this point we decide if merge request can be created # If we have at least one commit to merge -> creation allowed if commits.present? merge_request.compare_commits = Commit.decorate(commits, merge_request.source_project) merge_request.can_be_created = true merge_request.compare_failed = false # Try to collect diff for merge request. diffs = compare_result.diffs if diffs.present? merge_request.compare_diffs = diffs elsif diffs == false merge_request.can_be_created = false merge_request.compare_failed = true end else merge_request.can_be_created = false merge_request.compare_failed = false end commits = merge_request.compare_commits if commits && commits.count == 1 commit = commits.first merge_request.title = commit.title merge_request.description ||= commit.description.try(:strip) else merge_request.title = merge_request.source_branch.titleize.humanize end merge_request end def build_failed(merge_request, message) merge_request.errors.add(:base, message) unless message.nil? merge_request.compare_commits = [] merge_request.can_be_created = false merge_request end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/create_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/create_service0000644000175600017570000000214712672631600031160 0ustar pravipravimodule MergeRequests class CreateService < MergeRequests::BaseService def execute # @project is used to determine whether the user can set the merge request's # assignee, milestone and labels. Whether they can depends on their # permissions on the target project. source_project = @project @project = Project.find(params[:target_project_id]) if params[:target_project_id] filter_params label_params = params[:label_ids] merge_request = MergeRequest.new(params.except(:label_ids)) merge_request.source_project = source_project merge_request.target_project ||= source_project merge_request.author = current_user if merge_request.save merge_request.update_attributes(label_ids: label_params) event_service.open_mr(merge_request, current_user) notification_service.new_merge_request(merge_request, current_user) todo_service.new_merge_request(merge_request, current_user) merge_request.create_cross_references!(current_user) execute_hooks(merge_request) end merge_request end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/close_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/close_service.0000644000175600017570000000117512672631600031100 0ustar pravipravimodule MergeRequests class CloseService < MergeRequests::BaseService def execute(merge_request, commit = nil) # If we close MergeRequest we want to ignore validation # so we can close broken one (Ex. fork project removed) merge_request.allow_broken = true if merge_request.close event_service.close_mr(merge_request, current_user) create_note(merge_request) notification_service.close_mr(merge_request, current_user) todo_service.close_merge_request(merge_request, current_user) execute_hooks(merge_request, 'close') end merge_request end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/merge_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/merge_service.0000644000175600017570000000300412672631600031063 0ustar pravipravimodule MergeRequests # MergeService class # # Do git merge and in case of success # mark merge request as merged and execute all hooks and notifications # Executed when you do merge via GitLab UI # class MergeService < MergeRequests::BaseService attr_reader :merge_request def execute(merge_request) @merge_request = merge_request return error('Merge request is not mergeable') unless @merge_request.mergeable? merge_request.in_locked_state do if commit after_merge success else error('Can not merge changes') end end end private def commit committer = repository.user_to_committer(current_user) options = { message: params[:commit_message] || merge_request.merge_commit_message, author: committer, committer: committer } commit_id = repository.merge(current_user, merge_request.source_sha, merge_request.target_branch, options) merge_request.update(merge_commit_sha: commit_id) rescue StandardError => e merge_request.update(merge_error: "Something went wrong during merge") Rails.logger.error(e.message) return false end def after_merge MergeRequests::PostMergeService.new(project, current_user).execute(merge_request) if params[:should_remove_source_branch].present? DeleteBranchService.new(@merge_request.source_project, current_user). execute(merge_request.source_branch) end end end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/base_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/base_service.r0000644000175600017570000000170112672631600031062 0ustar pravipravimodule MergeRequests class BaseService < ::IssuableBaseService def create_note(merge_request) SystemNoteService.change_status(merge_request, merge_request.target_project, current_user, merge_request.state, nil) end def hook_data(merge_request, action) hook_data = merge_request.to_hook_data(current_user) merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id) hook_data[:object_attributes][:url] = merge_request_url hook_data[:object_attributes][:action] = action hook_data end def execute_hooks(merge_request, action = 'open') if merge_request.project merge_data = hook_data(merge_request, action) merge_request.project.execute_hooks(merge_data, :merge_request_hooks) merge_request.project.execute_services(merge_data, :merge_request_hooks) end end private def filter_params super(:merge_request) end end end ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/merge_when_build_succeeds_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/merge_when_bui0000644000175600017570000000411312672631600031147 0ustar pravipravimodule MergeRequests class MergeWhenBuildSucceedsService < MergeRequests::BaseService # Marks the passed `merge_request` to be merged when the build succeeds or # updates the params for the automatic merge def execute(merge_request) merge_request.merge_params.merge!(params) # The service is also called when the merge params are updated. already_approved = merge_request.merge_when_build_succeeds? unless already_approved merge_request.merge_when_build_succeeds = true merge_request.merge_user = @current_user SystemNoteService.merge_when_build_succeeds(merge_request, @project, @current_user, merge_request.last_commit) end merge_request.save end # Triggers the automatic merge of merge_request once the build succeeds def trigger(commit_status) merge_requests = merge_request_from(commit_status) merge_requests.each do |merge_request| next unless merge_request.merge_when_build_succeeds? if merge_request.ci_commit && merge_request.ci_commit.success? && merge_request.mergeable? MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params) end end end # Cancels the automatic merge def cancel(merge_request) if merge_request.merge_when_build_succeeds? && merge_request.open? merge_request.reset_merge_when_build_succeeds SystemNoteService.cancel_merge_when_build_succeeds(merge_request, @project, @current_user) success else error("Can't cancel the automatic merge", 406) end end private def merge_request_from(commit_status) branches = commit_status.ref # This is for ref-less builds branches ||= @project.repository.branch_names_contains(commit_status.sha) merge_requests = @project.origin_merge_requests.opened.where(source_branch: branches).to_a merge_requests += @project.fork_merge_requests.opened.where(source_branch: branches).to_a merge_requests.uniq.select(&:source_project) end end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/post_merge_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/post_merge_ser0000644000175600017570000000171712672631600031214 0ustar pravipravimodule MergeRequests # PostMergeService class # # Mark existing merge request as merged # and execute all hooks and notifications # class PostMergeService < MergeRequests::BaseService def execute(merge_request) close_issues(merge_request) merge_request.mark_as_merged create_merge_event(merge_request, current_user) create_note(merge_request) notification_service.merge_mr(merge_request, current_user) execute_hooks(merge_request, 'merge') end private def close_issues(merge_request) return unless merge_request.target_branch == project.default_branch closed_issues = merge_request.closes_issues(current_user) closed_issues.each do |issue| Issues::CloseService.new(project, current_user, {}).execute(issue, merge_request) end end def create_merge_event(merge_request, current_user) EventCreateService.new.merge_mr(merge_request, current_user) end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/update_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/merge_requests/update_service0000644000175600017570000000354112672631600031176 0ustar pravipravirequire_relative 'base_service' require_relative 'reopen_service' require_relative 'close_service' module MergeRequests class UpdateService < MergeRequests::BaseService def execute(merge_request) # We don't allow change of source/target projects and source branch # after merge request was created params.except!(:source_project_id) params.except!(:target_project_id) params.except!(:source_branch) update(merge_request) end def handle_changes(merge_request, options = {}) if has_changes?(merge_request, options) todo_service.mark_pending_todos_as_done(merge_request, current_user) end if merge_request.previous_changes.include?('title') || merge_request.previous_changes.include?('description') todo_service.update_merge_request(merge_request, current_user) end if merge_request.previous_changes.include?('target_branch') create_branch_change_note(merge_request, 'target', merge_request.previous_changes['target_branch'].first, merge_request.target_branch) end if merge_request.previous_changes.include?('milestone_id') create_milestone_note(merge_request) end if merge_request.previous_changes.include?('assignee_id') create_assignee_note(merge_request) notification_service.reassigned_merge_request(merge_request, current_user) todo_service.reassigned_merge_request(merge_request, current_user) end if merge_request.previous_changes.include?('target_branch') || merge_request.previous_changes.include?('source_branch') merge_request.mark_as_unchecked end end def reopen_service MergeRequests::ReopenService end def close_service MergeRequests::CloseService end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/system_note_service.rb0000644000175600017570000003046512672631600027642 0ustar pravipravi# SystemNoteService # # Used for creating system notes (e.g., when a user references a merge request # from an issue, an issue's assignee changes, an issue is closed, etc.) class SystemNoteService # Called when commits are added to a Merge Request # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # new_commits - Array of Commits added since last push # existing_commits - Array of Commits added in a previous push # oldrev - Optional String SHA of a previous Commit # # See new_commit_summary and existing_commit_summary. # # Returns the created Note object def self.add_commits(noteable, project, author, new_commits, existing_commits = [], oldrev = nil) total_count = new_commits.length + existing_commits.length commits_text = "#{total_count} commit".pluralize(total_count) body = "Added #{commits_text}:\n\n" body << existing_commit_summary(noteable, existing_commits, oldrev) body << new_commit_summary(new_commits).join("\n") create_note(noteable: noteable, project: project, author: author, note: body) end # Called when the assignee of a Noteable is changed or removed # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # assignee - User being assigned, or nil # # Example Note text: # # "Assignee removed" # # "Reassigned to @rspeicher" # # Returns the created Note object def self.change_assignee(noteable, project, author, assignee) body = assignee.nil? ? 'Assignee removed' : "Reassigned to #{assignee.to_reference}" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when one or more labels on a Noteable are added and/or removed # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # added_labels - Array of Labels added # removed_labels - Array of Labels removed # # Example Note text: # # "Added ~1 and removed ~2 ~3 labels" # # "Added ~4 label" # # "Removed ~5 label" # # Returns the created Note object def self.change_label(noteable, project, author, added_labels, removed_labels) labels_count = added_labels.count + removed_labels.count references = ->(label) { label.to_reference(:id) } added_labels = added_labels.map(&references).join(' ') removed_labels = removed_labels.map(&references).join(' ') body = '' if added_labels.present? body << "added #{added_labels}" body << ' and ' if removed_labels.present? end if removed_labels.present? body << "removed #{removed_labels}" end body << ' ' << 'label'.pluralize(labels_count) body = "#{body.capitalize}" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when the milestone of a Noteable is changed # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # milestone - Milestone being assigned, or nil # # Example Note text: # # "Milestone removed" # # "Miletone changed to 7.11" # # Returns the created Note object def self.change_milestone(noteable, project, author, milestone) body = 'Milestone ' body += milestone.nil? ? 'removed' : "changed to #{milestone.to_reference(project)}" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when the status of a Noteable is changed # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # status - String status # source - Mentionable performing the change, or nil # # Example Note text: # # "Status changed to merged" # # "Status changed to closed by bc17db76" # # Returns the created Note object def self.change_status(noteable, project, author, status, source) body = "Status changed to #{status}" body += " by #{source.gfm_reference(project)}" if source create_note(noteable: noteable, project: project, author: author, note: body) end # Called when 'merge when build succeeds' is executed def self.merge_when_build_succeeds(noteable, project, author, last_commit) body = "Enabled an automatic merge when the build for #{last_commit.to_reference(project)} succeeds" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when 'merge when build succeeds' is canceled def self.cancel_merge_when_build_succeeds(noteable, project, author) body = "Canceled the automatic merge" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when the title of a Noteable is changed # # noteable - Noteable object that responds to `title` # project - Project owning noteable # author - User performing the change # old_title - Previous String title # # Example Note text: # # "Title changed from **Old** to **New**" # # Returns the created Note object def self.change_title(noteable, project, author, old_title) return unless noteable.respond_to?(:title) body = "Title changed from **#{old_title}** to **#{noteable.title}**" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when a branch in Noteable is changed # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # branch_type - 'source' or 'target' # old_branch - old branch name # new_branch - new branch nmae # # Example Note text: # # "Target branch changed from `Old` to `New`" # # Returns the created Note object def self.change_branch(noteable, project, author, branch_type, old_branch, new_branch) body = "#{branch_type} branch changed from `#{old_branch}` to `#{new_branch}`".capitalize create_note(noteable: noteable, project: project, author: author, note: body) end # Called when a branch in Noteable is added or deleted # # noteable - Noteable object # project - Project owning noteable # author - User performing the change # branch_type - :source or :target # branch - branch name # presence - :add or :delete # # Example Note text: # # "Restored target branch `feature`" # # Returns the created Note object def self.change_branch_presence(noteable, project, author, branch_type, branch, presence) verb = if presence == :add 'restored' else 'deleted' end body = "#{verb} #{branch_type.to_s} branch `#{branch}`".capitalize create_note(noteable: noteable, project: project, author: author, note: body) end # Called when a Mentionable references a Noteable # # noteable - Noteable object being referenced # mentioner - Mentionable object # author - User performing the reference # # Example Note text: # # "mentioned in #1" # # "mentioned in !2" # # "mentioned in 54f7727c" # # See cross_reference_note_content. # # Returns the created Note object def self.cross_reference(noteable, mentioner, author) return if cross_reference_disallowed?(noteable, mentioner) gfm_reference = mentioner.gfm_reference(noteable.project) note_options = { project: noteable.project, author: author, note: cross_reference_note_content(gfm_reference) } if noteable.kind_of?(Commit) note_options.merge!(noteable_type: 'Commit', commit_id: noteable.id) else note_options.merge!(noteable: noteable) end if noteable.is_a?(ExternalIssue) noteable.project.issues_tracker.create_cross_reference_note(noteable, mentioner, author) else create_note(note_options) end end def self.cross_reference?(note_text) note_text.start_with?(cross_reference_note_prefix) end # Check if a cross-reference is disallowed # # This method prevents adding a "mentioned in !1" note on every single commit # in a merge request. Additionally, it prevents the creation of references to # external issues (which would fail). # # noteable - Noteable object being referenced # mentioner - Mentionable object # # Returns Boolean def self.cross_reference_disallowed?(noteable, mentioner) return true if noteable.is_a?(ExternalIssue) && !noteable.project.jira_tracker_active? return false unless mentioner.is_a?(MergeRequest) return false unless noteable.is_a?(Commit) mentioner.commits.include?(noteable) end # Check if a cross reference to a noteable from a mentioner already exists # # This method is used to prevent multiple notes being created for a mention # when a issue is updated, for example. The method also calls notes_for_mentioner # to check if the mentioner is a commit, and return matches only on commit hash # instead of project + commit, to avoid repeated mentions from forks. # # noteable - Noteable object being referenced # mentioner - Mentionable object # # Returns Boolean def self.cross_reference_exists?(noteable, mentioner) # Initial scope should be system notes of this noteable type notes = Note.system.where(noteable_type: noteable.class) if noteable.is_a?(Commit) # Commits have non-integer IDs, so they're stored in `commit_id` notes = notes.where(commit_id: noteable.id) else notes = notes.where(noteable_id: noteable.id) end notes_for_mentioner(mentioner, noteable, notes).count > 0 end private def self.notes_for_mentioner(mentioner, noteable, notes) if mentioner.is_a?(Commit) notes.where('note LIKE ?', "#{cross_reference_note_prefix}%#{mentioner.to_reference(nil)}") else gfm_reference = mentioner.gfm_reference(noteable.project) notes.where(note: cross_reference_note_content(gfm_reference)) end end def self.create_note(args = {}) Note.create(args.merge(system: true)) end def self.cross_reference_note_prefix 'mentioned in ' end def self.cross_reference_note_content(gfm_reference) "#{cross_reference_note_prefix}#{gfm_reference}" end # Build an Array of lines detailing each commit added in a merge request # # new_commits - Array of new Commit objects # # Returns an Array of Strings def self.new_commit_summary(new_commits) new_commits.collect do |commit| "* #{commit.short_id} - #{commit.title}" end end # Build a single line summarizing existing commits being added in a merge # request # # noteable - MergeRequest object # existing_commits - Array of existing Commit objects # oldrev - Optional String SHA of a previous Commit # # Examples: # # "* ea0f8418...2f4426b7 - 24 commits from branch `master`" # # "* ea0f8418..4188f0ea - 15 commits from branch `fork:master`" # # "* ea0f8418 - 1 commit from branch `feature`" # # Returns a newline-terminated String def self.existing_commit_summary(noteable, existing_commits, oldrev = nil) return '' if existing_commits.empty? count = existing_commits.size commit_ids = if count == 1 existing_commits.first.short_id else if oldrev && !Gitlab::Git.blank_ref?(oldrev) "#{Commit.truncate_sha(oldrev)}...#{existing_commits.last.short_id}" else "#{existing_commits.first.short_id}..#{existing_commits.last.short_id}" end end commits_text = "#{count} commit".pluralize(count) branch = noteable.target_branch branch = "#{noteable.target_project_namespace}:#{branch}" if noteable.for_fork? "* #{commit_ids} - #{commits_text} from branch `#{branch}`\n" end # Called when the status of a Task has changed # # noteable - Noteable object. # project - Project owning noteable # author - User performing the change # new_task - TaskList::Item object. # # Example Note text: # # "Soandso marked the task Whatever as completed." # # Returns the created Note object def self.change_task_status(noteable, project, author, new_task) status_label = new_task.complete? ? Taskable::COMPLETED : Taskable::INCOMPLETE body = "Marked the task **#{new_task.source}** as #{status_label}" create_note(noteable: noteable, project: project, author: author, note: body) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/0000755000175600017570000000000012672631600025376 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/reopen_service.rb0000644000175600017570000000034612672631600030736 0ustar pravipravimodule Milestones class ReopenService < Milestones::BaseService def execute(milestone) if milestone.activate event_service.reopen_milestone(milestone, current_user) end milestone end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/create_service.rb0000644000175600017570000000040712672631600030707 0ustar pravipravimodule Milestones class CreateService < Milestones::BaseService def execute milestone = project.milestones.new(params) if milestone.save event_service.open_milestone(milestone, current_user) end milestone end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/close_service.rb0000644000175600017570000000034112672631600030546 0ustar pravipravimodule Milestones class CloseService < Milestones::BaseService def execute(milestone) if milestone.close event_service.close_milestone(milestone, current_user) end milestone end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/base_service.rb0000644000175600017570000000010012672631600030344 0ustar pravipravimodule Milestones class BaseService < ::BaseService end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/destroy_service.rb0000644000175600017570000000133612672631600031137 0ustar pravipravimodule Milestones class DestroyService < Milestones::BaseService def execute(milestone) Milestone.transaction do update_params = { milestone: nil } milestone.issues.each do |issue| Issues::UpdateService.new(project, current_user, update_params).execute(issue) end milestone.merge_requests.each do |merge_request| MergeRequests::UpdateService.new(project, current_user, update_params).execute(merge_request) end event_service.destroy_milestone(milestone, current_user) Event.for_milestone_id(milestone.id).each do |event| event.target_id = nil event.save end milestone.destroy end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/milestones/update_service.rb0000644000175600017570000000076412672631600030734 0ustar pravipravimodule Milestones class UpdateService < Milestones::BaseService def execute(milestone) state = params[:state_event] case state when 'activate' Milestones::ReopenService.new(project, current_user, {}).execute(milestone) when 'close' Milestones::CloseService.new(project, current_user, {}).execute(milestone) end if params.present? milestone.update_attributes(params.except(:state_event)) end milestone end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/git_hooks_service.rb0000644000175600017570000000120012672631600027240 0ustar pravipraviclass GitHooksService PreReceiveError = Class.new(StandardError) def execute(user, repo_path, oldrev, newrev, ref) @repo_path = repo_path @user = Gitlab::ShellEnv.gl_id(user) @oldrev = oldrev @newrev = newrev @ref = ref %w(pre-receive update).each do |hook_name| unless run_hook(hook_name) raise PreReceiveError.new("Git operation was rejected by #{hook_name} hook") end end yield run_hook('post-receive') end private def run_hook(name) hook = Gitlab::Git::Hook.new(name, @repo_path) hook.trigger(@user, @oldrev, @newrev, @ref) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/git_tag_push_service.rb0000644000175600017570000000203712672631600027740 0ustar pravipraviclass GitTagPushService attr_accessor :project, :user, :push_data def execute(project, user, oldrev, newrev, ref) project.repository.expire_cache @project, @user = project, user @push_data = build_push_data(oldrev, newrev, ref) EventCreateService.new.push(project, user, @push_data) project.execute_hooks(@push_data.dup, :tag_push_hooks) project.execute_services(@push_data.dup, :tag_push_hooks) CreateCommitBuildsService.new.execute(project, @user, @push_data) ProjectCacheWorker.perform_async(project.id) true end private def build_push_data(oldrev, newrev, ref) commits = [] message = nil if !Gitlab::Git.blank_ref?(newrev) tag_name = Gitlab::Git.ref_name(ref) tag = project.repository.find_tag(tag_name) if tag && tag.target == newrev commit = project.commit(tag.target) commits = [commit].compact message = tag.message end end Gitlab::PushDataBuilder. build(project, user, oldrev, newrev, ref, commits, message) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/event_create_service.rb0000644000175600017570000000456712672631600027741 0ustar pravipravi# EventCreateService class # # Used for creating events feed on dashboard after certain user action # # Ex. # EventCreateService.new.new_issue(issue, current_user) # class EventCreateService def open_issue(issue, current_user) create_record_event(issue, current_user, Event::CREATED) end def close_issue(issue, current_user) create_record_event(issue, current_user, Event::CLOSED) end def reopen_issue(issue, current_user) create_record_event(issue, current_user, Event::REOPENED) end def open_mr(merge_request, current_user) create_record_event(merge_request, current_user, Event::CREATED) end def close_mr(merge_request, current_user) create_record_event(merge_request, current_user, Event::CLOSED) end def reopen_mr(merge_request, current_user) create_record_event(merge_request, current_user, Event::REOPENED) end def merge_mr(merge_request, current_user) create_record_event(merge_request, current_user, Event::MERGED) end def open_milestone(milestone, current_user) create_record_event(milestone, current_user, Event::CREATED) end def close_milestone(milestone, current_user) create_record_event(milestone, current_user, Event::CLOSED) end def reopen_milestone(milestone, current_user) create_record_event(milestone, current_user, Event::REOPENED) end def destroy_milestone(milestone, current_user) create_record_event(milestone, current_user, Event::DESTROYED) end def leave_note(note, current_user) create_record_event(note, current_user, Event::COMMENTED) end def join_project(project, current_user) create_event(project, current_user, Event::JOINED) end def leave_project(project, current_user) create_event(project, current_user, Event::LEFT) end def create_project(project, current_user) create_event(project, current_user, Event::CREATED) end def push(project, current_user, push_data) create_event(project, current_user, Event::PUSHED, data: push_data) end private def create_record_event(record, current_user, status) create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name) end def create_event(project, current_user, status, attributes = {}) attributes.reverse_merge!( project: project, action: status, author_id: current_user.id ) Event.create(attributes) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/search/0000755000175600017570000000000012672631600024461 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/search/snippet_service.rb0000644000175600017570000000052312672631600030210 0ustar pravipravimodule Search class SnippetService attr_accessor :current_user, :params def initialize(user, params) @current_user, @params = user, params.dup end def execute snippet_ids = Snippet.accessible_to(current_user).pluck(:id) Gitlab::SnippetSearchResults.new(snippet_ids, params[:search]) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/search/global_service.rb0000644000175600017570000000076612672631600027777 0ustar pravipravimodule Search class GlobalService attr_accessor :current_user, :params def initialize(user, params) @current_user, @params = user, params.dup end def execute group = Group.find_by(id: params[:group_id]) if params[:group_id].present? projects = ProjectsFinder.new.execute(current_user) projects = projects.in_namespace(group.id) if group project_ids = projects.pluck(:id) Gitlab::SearchResults.new(project_ids, params[:search]) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/search/project_service.rb0000644000175600017570000000063412672631600030177 0ustar pravipravimodule Search class ProjectService attr_accessor :project, :current_user, :params def initialize(project, user, params) @project, @current_user, @params = project, user, params.dup end def execute Gitlab::ProjectSearchResults.new(project.id, params[:search], params[:repository_ref]) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_spam_log_service.rb0000644000175600017570000000052112672631600030403 0ustar pravipraviclass CreateSpamLogService < BaseService def initialize(project, user, params) super(project, user, params) end def execute spam_params = params.merge({ user_id: @current_user.id, project_id: @project.id } ) spam_log = SpamLog.new(spam_params) spam_log.save spam_log end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_tag_service.rb0000644000175600017570000000270012672631600027356 0ustar pravipravirequire_relative 'base_service' class CreateTagService < BaseService def execute(tag_name, ref, message, release_description = nil) valid_tag = Gitlab::GitRefValidator.validate(tag_name) if valid_tag == false return error('Tag name invalid') end repository = project.repository existing_tag = repository.find_tag(tag_name) if existing_tag return error('Tag already exists') end message.strip! if message repository.add_tag(tag_name, ref, message) new_tag = repository.find_tag(tag_name) if new_tag push_data = create_push_data(project, current_user, new_tag) EventCreateService.new.push(project, current_user, push_data) project.execute_hooks(push_data.dup, :tag_push_hooks) project.execute_services(push_data.dup, :tag_push_hooks) CreateCommitBuildsService.new.execute(project, current_user, push_data) if release_description CreateReleaseService.new(@project, @current_user). execute(tag_name, release_description) end success(new_tag) else error('Invalid reference name') end end def success(branch) out = super() out[:tag] = branch out end def create_push_data(project, user, tag) commits = [project.commit(tag.target)].compact Gitlab::PushDataBuilder. build(project, user, Gitlab::Git::BLANK_SHA, tag.target, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", commits, tag.message) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/update_release_service.rb0000644000175600017570000000114212672631600030241 0ustar pravipravirequire_relative 'base_service' class UpdateReleaseService < BaseService def execute(tag_name, release_description) repository = project.repository existing_tag = repository.find_tag(tag_name) if existing_tag release = project.releases.find_by(tag: tag_name) if release release.update_attributes(description: release_description) success(release) else error('Release does not exist', 404) end else error('Tag does not exist', 404) end end def success(release) out = super() out[:release] = release out end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_snippet_service.rb0000644000175600017570000000071612672631600030272 0ustar pravipraviclass CreateSnippetService < BaseService def execute if project.nil? snippet = PersonalSnippet.new(params) else snippet = project.snippets.build(params) end unless Gitlab::VisibilityLevel.allowed_for?(current_user, params[:visibility_level]) deny_visibility_level(snippet) return snippet end snippet.author = current_user snippet.save snippet end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/base_service.rb0000644000175600017570000000251312672631600026174 0ustar pravipraviclass BaseService include Gitlab::CurrentSettings attr_accessor :project, :current_user, :params def initialize(project, user, params = {}) @project, @current_user, @params = project, user, params.dup end def abilities Ability.abilities end def can?(object, action, subject) abilities.allowed?(object, action, subject) end def notification_service NotificationService.new end def event_service EventCreateService.new end def todo_service TodoService.new end def log_info(message) Gitlab::AppLogger.info message end def system_hook_service SystemHooksService.new end def repository project.repository end # Add an error to the specified model for restricted visibility levels def deny_visibility_level(model, denied_visibility_level = nil) denied_visibility_level ||= model.visibility_level level_name = Gitlab::VisibilityLevel.level_name(denied_visibility_level) model.errors.add( :visibility_level, "#{level_name} visibility has been restricted by your GitLab administrator" ) end private def error(message, http_status = nil) result = { message: message, status: :error } result[:http_status] = http_status if http_status result end def success { status: :success } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/oauth2/0000755000175600017570000000000012672631600024416 5ustar pravipravi././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/oauth2/access_token_validation_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/oauth2/access_token_validatio0000644000175600017570000000203112672631600031032 0ustar pravipravimodule Oauth2::AccessTokenValidationService # Results: VALID = :valid EXPIRED = :expired REVOKED = :revoked INSUFFICIENT_SCOPE = :insufficient_scope class << self def validate(token, scopes: []) if token.expired? return EXPIRED elsif token.revoked? return REVOKED elsif !self.sufficient_scope?(token, scopes) return INSUFFICIENT_SCOPE else return VALID end end protected # True if the token's scope is a superset of required scopes, # or the required scopes is empty. def sufficient_scope?(token, scopes) if scopes.blank? # if no any scopes required, the scopes of token is sufficient. return true else # If there are scopes required, then check whether # the set of authorized scopes is a superset of the set of required scopes required_scopes = Set.new(scopes) authorized_scopes = Set.new(token.scopes) return authorized_scopes >= required_scopes end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/0000755000175600017570000000000012672631600023607 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/web_hook_service.rb0000644000175600017570000000155212672631600027454 0ustar pravipravimodule Ci class WebHookService def build_end(build) execute_hooks(build.project, build_data(build)) end def execute_hooks(project, data) project.web_hooks.each do |web_hook| async_execute_hook(web_hook, data) end end def async_execute_hook(hook, data) Sidekiq::Client.enqueue(Ci::WebHookWorker, hook.id, data) end def build_data(build) project = build.project data = {} data.merge!({ build_id: build.id, build_name: build.name, build_status: build.status, build_started_at: build.started_at, build_finished_at: build.finished_at, project_id: project.id, project_name: project.name, gitlab_url: project.gitlab_url, ref: build.ref, before_sha: build.before_sha, sha: build.sha, }) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/create_builds_service.rb0000644000175600017570000000255212672631600030465 0ustar pravipravimodule Ci class CreateBuildsService def execute(commit, stage, ref, tag, user, trigger_request, status) builds_attrs = commit.config_processor.builds_for_stage_and_ref(stage, ref, tag) # check when to create next build builds_attrs = builds_attrs.select do |build_attrs| case build_attrs[:when] when 'on_success' status == 'success' when 'on_failure' status == 'failed' when 'always' %w(success failed).include?(status) end end builds_attrs.map do |build_attrs| # don't create the same build twice unless commit.builds.find_by(ref: ref, tag: tag, trigger_request: trigger_request, name: build_attrs[:name]) build_attrs.slice!(:name, :commands, :tag_list, :options, :allow_failure, :stage, :stage_idx) build_attrs.merge!(ref: ref, tag: tag, trigger_request: trigger_request, user: user, project: commit.project) build = commit.builds.create!(build_attrs) build.execute_hooks build end end end end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/create_trigger_request_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/create_trigger_request_ser0000644000175600017570000000104112672631600031135 0ustar pravipravimodule Ci class CreateTriggerRequestService def execute(project, trigger, ref, variables = nil) commit = project.commit(ref) return unless commit # check if ref is tag tag = project.repository.find_tag(ref).present? ci_commit = project.ensure_ci_commit(commit.sha) trigger_request = trigger.trigger_requests.create!( variables: variables, commit: ci_commit, ) if ci_commit.create_builds(ref, tag, nil, trigger_request) trigger_request end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/image_for_build_service.rb0000644000175600017570000000111612672631600030762 0ustar pravipravimodule Ci class ImageForBuildService def execute(project, opts) sha = opts[:sha] || ref_sha(project, opts[:ref]) commit = project.ci_commits.ordered.find_by(sha: sha) image_name = image_for_commit(commit) image_path = Rails.root.join('public/ci', image_name) OpenStruct.new(path: image_path, name: image_name) end private def ref_sha(project, ref) project.commit(ref).try(:sha) if ref end def image_for_commit(commit) return 'build-unknown.svg' unless commit 'build-' + commit.status + ".svg" end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/ci/register_build_service.rb0000644000175600017570000000217712672631600030666 0ustar pravipravimodule Ci # This class responsible for assigning # proper pending build to runner on runner API request class RegisterBuildService def execute(current_runner) builds = Ci::Build.pending.unstarted builds = if current_runner.shared? # don't run projects which have not enables shared runners builds.joins(:project).where(projects: { builds_enabled: true, shared_runners_enabled: true }) else # do run projects which are only assigned to this runner builds.where(project: current_runner.projects.where(builds_enabled: true)) end builds = builds.order('created_at ASC') build = builds.find do |build| build.can_be_served?(current_runner) end if build # In case when 2 runners try to assign the same build, second runner will be declined # with StateMachines::InvalidTransition in run! method. build.with_lock do build.runner_id = current_runner.id build.save! build.run! end end build rescue StateMachines::InvalidTransition nil end end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/repair_ldap_blocked_user_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/repair_ldap_blocked_user_serv0000644000175600017570000000037412672631600031205 0ustar pravipraviclass RepairLdapBlockedUserService attr_accessor :user def initialize(user) @user = user end def execute user.block if ldap_hard_blocked? end private def ldap_hard_blocked? user.ldap_blocked? && !user.ldap_user? end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/destroy_group_service.rb0000644000175600017570000000067312672631600030174 0ustar pravipraviclass DestroyGroupService attr_accessor :group, :current_user def initialize(group, user) @group, @current_user = group, user end def execute @group.projects.each do |project| # Skip repository removal because we remove directory with namespace # that contain all this repositories ::Projects::DestroyService.new(project, current_user, skip_repo: true).pending_delete! end @group.destroy end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/0000755000175600017570000000000012672631600025045 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/participants_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/participants_service0000644000175600017570000000243612672631600031216 0ustar pravipravimodule Projects class ParticipantsService < BaseService def execute(note_type, note_id) participating = if note_type && note_id participants_in(note_type, note_id) else [] end project_members = sorted(project.team.members) participants = all_members + groups + project_members + participating participants.uniq end def participants_in(type, id) target = case type when "Issue" project.issues.find_by_iid(id) when "MergeRequest" project.merge_requests.find_by_iid(id) when "Commit" project.commit(id) end return [] unless target users = target.participants(current_user) sorted(users) end def sorted(users) users.uniq.to_a.compact.sort_by(&:username).map do |user| { username: user.username, name: user.name } end end def groups current_user.authorized_groups.sort_by(&:path).map do |group| count = group.users.count { username: group.path, name: group.name, count: count } end end def all_members count = project.team.members.flatten.count [{ username: "all", name: "All Project and Group Members", count: count }] end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/housekeeping_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/housekeeping_service0000644000175600017570000000061212672631600031175 0ustar pravipravi# Projects::HousekeepingService class # # Used for git housekeeping # # Ex. # Projects::HousekeepingService.new(project).execute # module Projects class HousekeepingService < BaseService include Gitlab::ShellAdapter def initialize(project) @project = project end def execute GitlabShellWorker.perform_async(:gc, @project.path_with_namespace) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/fork_service.rb0000644000175600017570000000142112672631600030051 0ustar pravipravimodule Projects class ForkService < BaseService def execute new_params = { forked_from_project_id: @project.id, visibility_level: @project.visibility_level, description: @project.description, name: @project.name, path: @project.path, shared_runners_enabled: @project.shared_runners_enabled, builds_enabled: @project.builds_enabled, namespace_id: @params[:namespace].try(:id) || current_user.namespace.id } if @project.avatar.present? && @project.avatar.image? new_params[:avatar] = @project.avatar end new_project = CreateService.new(current_user, new_params).execute new_project end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/create_service.rb0000644000175600017570000000565012672631600030363 0ustar pravipravimodule Projects class CreateService < BaseService def initialize(user, params) @current_user, @params = user, params.dup end def execute forked_from_project_id = params.delete(:forked_from_project_id) @project = Project.new(params) # Make sure that the user is allowed to use the specified visibility # level unless Gitlab::VisibilityLevel.allowed_for?(current_user, params[:visibility_level]) deny_visibility_level(@project) return @project end # Set project name from path if @project.name.present? && @project.path.present? # if both name and path set - everything is ok elsif @project.path.present? # Set project name from path @project.name = @project.path.dup elsif @project.name.present? # For compatibility - set path from name # TODO: remove this in 8.0 @project.path = @project.name.dup.parameterize end # get namespace id namespace_id = params[:namespace_id] if namespace_id # Find matching namespace and check if it allowed # for current user if namespace_id passed. unless allowed_namespace?(current_user, namespace_id) @project.namespace_id = nil deny_namespace return @project end else # Set current user namespace if namespace_id is nil @project.namespace_id = current_user.namespace_id end @project.creator = current_user if forked_from_project_id @project.build_forked_project_link(forked_from_project_id: forked_from_project_id) end Project.transaction do @project.save if @project.persisted? && !@project.import? unless @project.create_repository raise 'Failed to create repository' end end end after_create_actions if @project.persisted? @project rescue => e message = "Unable to save project: #{e.message}" Rails.logger.error(message) @project.errors.add(:base, message) if @project @project end protected def deny_namespace @project.errors.add(:namespace, "is not valid") end def allowed_namespace?(user, namespace_id) namespace = Namespace.find_by(id: namespace_id) current_user.can?(:create_projects, namespace) end def after_create_actions log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") @project.create_wiki if @project.wiki_enabled? @project.build_missing_services @project.create_labels event_service.create_project(@project, current_user) system_hook_service.execute_hooks_for(@project, :create) unless @project.group @project.team << [current_user, :master, current_user] end @project.import_start if @project.import? end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/import_service.rb0000644000175600017570000000253412672631600030430 0ustar pravipravimodule Projects class ImportService < BaseService include Gitlab::ShellAdapter class Error < StandardError; end ALLOWED_TYPES = [ 'bitbucket', 'fogbugz', 'gitlab', 'github', 'google_code' ] def execute if unknown_url? # In this case, we only want to import issues, not a repository. create_repository else import_repository end import_data success rescue Error => e error(e.message) end private def create_repository unless project.create_repository raise Error, 'The repository could not be created.' end end def import_repository begin gitlab_shell.import_repository(project.path_with_namespace, project.import_url) rescue Gitlab::Shell::Error => e raise Error, e.message end end def import_data return unless has_importer? unless importer.execute raise Error, 'The remote data could not be imported.' end end def has_importer? ALLOWED_TYPES.include?(project.import_type) end def importer class_name = "Gitlab::#{project.import_type.camelize}Import::Importer" class_name.constantize.new(project) end def unknown_url? project.import_url == Project::UNKNOWN_IMPORT_URL end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/download_service.rb0000644000175600017570000000123712672631600030724 0ustar pravipravimodule Projects class DownloadService < BaseService WHITELIST = [ /^[^.]+\.fogbugz.com$/ ] def initialize(project, url) @project, @url = project, url end def execute return nil unless valid_url?(@url) uploader = FileUploader.new(@project) uploader.download!(@url) uploader.store! uploader.to_h end private def valid_url?(url) url && http?(url) && valid_domain?(url) end def http?(url) url =~ /\A#{URI::regexp(['http', 'https'])}\z/ end def valid_domain?(url) host = URI.parse(url).host WHITELIST.any? { |entry| entry === host } end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/upload_service.rb0000644000175600017570000000070212672631600030375 0ustar pravipravimodule Projects class UploadService < BaseService def initialize(project, file) @project, @file = project, file end def execute return nil unless @file and @file.size <= max_attachment_size uploader = FileUploader.new(@project) uploader.store!(@file) uploader.to_h end private def max_attachment_size current_application_settings.max_attachment_size.megabytes.to_i end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/autocomplete_service.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/autocomplete_service0000644000175600017570000000045112672631600031211 0ustar pravipravimodule Projects class AutocompleteService < BaseService def initialize(project) @project = project end def issues @project.issues.opened.select([:iid, :title]) end def merge_requests @project.merge_requests.opened.select([:iid, :title]) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/transfer_service.rb0000644000175600017570000000430412672631600030737 0ustar pravipravi# Projects::TransferService class # # Used for transfer project to another namespace # # Ex. # # Move projects to namespace with ID 17 by user # Projects::TransferService.new(project, user, namespace_id: 17).execute # module Projects class TransferService < BaseService include Gitlab::ShellAdapter class TransferError < StandardError; end def execute(new_namespace) if allowed_transfer?(current_user, project, new_namespace) transfer(project, new_namespace) else project.errors.add(:new_namespace, 'is invalid') false end rescue Projects::TransferService::TransferError => ex project.reload project.errors.add(:new_namespace, ex.message) false end def transfer(project, new_namespace) Project.transaction do old_path = project.path_with_namespace old_namespace = project.namespace new_path = File.join(new_namespace.try(:path) || '', project.path) if Project.where(path: project.path, namespace_id: new_namespace.try(:id)).present? raise TransferError.new("Project with same path in target namespace already exists") end # Apply new namespace id project.namespace = new_namespace project.save! # Notifications project.send_move_instructions(old_path) # Move main repository unless gitlab_shell.mv_repository(old_path, new_path) raise TransferError.new('Cannot move project') end # Move wiki repo also if present gitlab_shell.mv_repository("#{old_path}.wiki", "#{new_path}.wiki") # clear project cached events project.reset_events_cache # Move uploads Gitlab::UploadsTransfer.new.move_project(project.path, old_namespace.path, new_namespace.path) project.old_path_with_namespace = old_path SystemHooksService.new.execute_hooks_for(project, :transfer) true end end def allowed_transfer?(current_user, project, namespace) namespace && can?(current_user, :change_namespace, project) && namespace.id != project.namespace_id && current_user.can?(:create_projects, namespace) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/destroy_service.rb0000644000175600017570000000500212672631600030600 0ustar pravipravimodule Projects class DestroyService < BaseService include Gitlab::ShellAdapter class DestroyError < StandardError; end DELETED_FLAG = '+deleted' def pending_delete! project.update_attribute(:pending_delete, true) ProjectDestroyWorker.perform_in(1.minute, project.id, current_user.id, params) end def execute return false unless can?(current_user, :remove_project, project) project.team.truncate repo_path = project.path_with_namespace wiki_path = repo_path + '.wiki' # Flush the cache for both repositories. This has to be done _before_ # removing the physical repositories as some expiration code depends on # Git data (e.g. a list of branch names). flush_caches(project, wiki_path) Project.transaction do project.destroy! unless remove_repository(repo_path) raise_error('Failed to remove project repository. Please try again or contact administrator') end unless remove_repository(wiki_path) raise_error('Failed to remove wiki repository. Please try again or contact administrator') end end log_info("Project \"#{project.name}\" was removed") system_hook_service.execute_hooks_for(project, :destroy) true end private def remove_repository(path) # Skip repository removal. We use this flag when remove user or group return true if params[:skip_repo] == true # There is a possibility project does not have repository or wiki return true unless gitlab_shell.exists?(path + '.git') new_path = removal_path(path) if gitlab_shell.mv_repository(path, new_path) log_info("Repository \"#{path}\" moved to \"#{new_path}\"") GitlabShellWorker.perform_in(5.minutes, :remove_repository, new_path) else false end end def raise_error(message) raise DestroyError.new(message) end # Build a path for removing repositories # We use `+` because its not allowed by GitLab so user can not create # project with name cookies+119+deleted and capture someone stalled repository # # gitlab/cookies.git -> gitlab/cookies+119+deleted.git # def removal_path(path) "#{path}+#{project.id}#{DELETED_FLAG}" end def flush_caches(project, wiki_path) project.repository.expire_all_caches! if project.repository.exists? wiki_repo = Repository.new(wiki_path, project) wiki_repo.expire_all_caches! if wiki_repo.exists? end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/projects/update_service.rb0000644000175600017570000000254012672631600030375 0ustar pravipravimodule Projects class UpdateService < BaseService def execute # check that user is allowed to set specified visibility_level new_visibility = params[:visibility_level] if new_visibility if new_visibility.to_i != project.visibility_level unless can?(current_user, :change_visibility_level, project) && Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility) deny_visibility_level(project, new_visibility) return project end end return false unless visibility_level_allowed?(new_visibility) end new_branch = params[:default_branch] if project.repository.exists? && new_branch && new_branch != project.default_branch project.change_head(new_branch) end if project.update_attributes(params.except(:default_branch)) if project.previous_changes.include?('path') project.rename_repo end end end private def visibility_level_allowed?(level) return true if project.visibility_level_allowed?(level) level_name = Gitlab::VisibilityLevel.level_name(level) project.errors.add( :visibility_level, "#{level_name} could not be set as visibility level of this project - parent project settings are more restrictive" ) false end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/archive_repository_service.rb0000644000175600017570000000101512672631600031176 0ustar pravipraviclass ArchiveRepositoryService attr_reader :project, :ref, :format def initialize(project, ref, format) format ||= 'tar.gz' @project, @ref, @format = project, ref, format.downcase end def execute(options = {}) RepositoryArchiveCacheWorker.perform_async metadata = project.repository.archive_metadata(ref, storage_path, format) raise "Repository or ref not found" if metadata.empty? metadata end private def storage_path Gitlab.config.gitlab.repository_downloads_path end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/audit_event_service.rb0000644000175600017570000000077112672631600027575 0ustar pravipraviclass AuditEventService def initialize(author, entity, details = {}) @author, @entity, @details = author, entity, details end def for_authentication @details = { with: @details[:with], target_id: @author.id, target_type: "User", target_details: @author.name, } self end def security_event SecurityEvent.create( author_id: @author.id, entity_id: @entity.id, entity_type: @entity.class.name, details: @details ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_branch_service.rb0000644000175600017570000000263412672631600030046 0ustar pravipravirequire_relative 'base_service' class CreateBranchService < BaseService def execute(branch_name, ref, source_project: @project) valid_branch = Gitlab::GitRefValidator.validate(branch_name) if valid_branch == false return error('Branch name is invalid') end repository = project.repository existing_branch = repository.find_branch(branch_name) if existing_branch return error('Branch already exists') end new_branch = nil if source_project != @project repository.with_tmp_ref do |tmp_ref| repository.fetch_ref( source_project.repository.path_to_repo, "refs/heads/#{ref}", tmp_ref ) new_branch = repository.add_branch(current_user, branch_name, tmp_ref) end else new_branch = repository.add_branch(current_user, branch_name, ref) end if new_branch # GitPushService handles execution of services and hooks for branch pushes success(new_branch) else error('Invalid reference name') end rescue GitHooksService::PreReceiveError error('Branch creation was rejected by Git hook') end def success(branch) out = super() out[:branch] = branch out end def build_push_data(project, user, branch) Gitlab::PushDataBuilder. build(project, user, Gitlab::Git::BLANK_SHA, branch.target, "#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}", []) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issuable_base_service.rb0000644000175600017570000000614512672631600030070 0ustar pravipraviclass IssuableBaseService < BaseService private def create_assignee_note(issuable) SystemNoteService.change_assignee( issuable, issuable.project, current_user, issuable.assignee) end def create_milestone_note(issuable) SystemNoteService.change_milestone( issuable, issuable.project, current_user, issuable.milestone) end def create_labels_note(issuable, added_labels, removed_labels) SystemNoteService.change_label( issuable, issuable.project, current_user, added_labels, removed_labels) end def create_title_change_note(issuable, old_title) SystemNoteService.change_title( issuable, issuable.project, current_user, old_title) end def create_branch_change_note(issuable, branch_type, old_branch, new_branch) SystemNoteService.change_branch( issuable, issuable.project, current_user, branch_type, old_branch, new_branch) end def create_task_status_note(issuable) issuable.updated_tasks.each do |task| SystemNoteService.change_task_status(issuable, issuable.project, current_user, task) end end def filter_params(issuable_ability_name = :issue) params[:assignee_id] = "" if params[:assignee_id] == IssuableFinder::NONE params[:milestone_id] = "" if params[:milestone_id] == IssuableFinder::NONE ability = :"admin_#{issuable_ability_name}" unless can?(current_user, ability, project) params.delete(:milestone_id) params.delete(:label_ids) params.delete(:assignee_id) end end def update(issuable) change_state(issuable) filter_params old_labels = issuable.labels.to_a if params.present? && issuable.update_attributes(params.merge(updated_by: current_user)) issuable.reset_events_cache handle_common_system_notes(issuable, old_labels: old_labels) handle_changes(issuable, old_labels: old_labels) issuable.create_new_cross_references!(current_user) execute_hooks(issuable, 'update') end issuable end def change_state(issuable) case params.delete(:state_event) when 'reopen' reopen_service.new(project, current_user, {}).execute(issuable) when 'close' close_service.new(project, current_user, {}).execute(issuable) end end def has_changes?(issuable, options = {}) valid_attrs = [:title, :description, :assignee_id, :milestone_id, :target_branch] attrs_changed = valid_attrs.any? do |attr| issuable.previous_changes.include?(attr.to_s) end old_labels = options[:old_labels] labels_changed = old_labels && issuable.labels != old_labels attrs_changed || labels_changed end def handle_common_system_notes(issuable, options = {}) if issuable.previous_changes.include?('title') create_title_change_note(issuable, issuable.previous_changes['title'].first) end if issuable.previous_changes.include?('description') && issuable.tasks? create_task_status_note(issuable) end old_labels = options[:old_labels] if old_labels && (issuable.labels != old_labels) create_labels_note(issuable, issuable.labels - old_labels, old_labels - issuable.labels) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/0000755000175600017570000000000012672631600024527 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/reopen_service.rb0000644000175600017570000000072612672631600030071 0ustar pravipravimodule Issues class ReopenService < Issues::BaseService def execute(issue) if issue.reopen event_service.reopen_issue(issue, current_user) create_note(issue) notification_service.reopen_issue(issue, current_user) execute_hooks(issue, 'reopen') end issue end private def create_note(issue) SystemNoteService.change_status(issue, issue.project, current_user, issue.state, nil) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/create_service.rb0000644000175600017570000000113312672631600030035 0ustar pravipravimodule Issues class CreateService < Issues::BaseService def execute filter_params label_params = params[:label_ids] issue = project.issues.new(params.except(:label_ids)) issue.author = current_user if issue.save issue.update_attributes(label_ids: label_params) notification_service.new_issue(issue, current_user) todo_service.new_issue(issue, current_user) event_service.open_issue(issue, current_user) issue.create_cross_references!(current_user) execute_hooks(issue, 'open') end issue end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/close_service.rb0000644000175600017570000000144312672631600027703 0ustar pravipravimodule Issues class CloseService < Issues::BaseService def execute(issue, commit = nil) if project.jira_tracker? && project.jira_service.active project.jira_service.execute(commit, issue) todo_service.close_issue(issue, current_user) return issue end if project.default_issues_tracker? && issue.close event_service.close_issue(issue, current_user) create_note(issue, commit) notification_service.close_issue(issue, current_user) todo_service.close_issue(issue, current_user) execute_hooks(issue, 'close') end issue end private def create_note(issue, current_commit) SystemNoteService.change_status(issue, issue.project, current_user, issue.state, current_commit) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/base_service.rb0000644000175600017570000000113612672631600027507 0ustar pravipravimodule Issues class BaseService < ::IssuableBaseService def hook_data(issue, action) issue_data = issue.to_hook_data(current_user) issue_url = Gitlab::UrlBuilder.new(:issue).build(issue.id) issue_data[:object_attributes].merge!(url: issue_url, action: action) issue_data end private def filter_params super(:issue) end def execute_hooks(issue, action = 'open') issue_data = hook_data(issue, action) issue.project.execute_hooks(issue_data, :issue_hooks) issue.project.execute_services(issue_data, :issue_hooks) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/bulk_update_service.rb0000644000175600017570000000136412672631600031077 0ustar pravipravimodule Issues class BulkUpdateService < BaseService def execute issues_ids = params.delete(:issues_ids).split(",") issue_params = params issue_params.delete(:state_event) unless issue_params[:state_event].present? issue_params.delete(:milestone_id) unless issue_params[:milestone_id].present? issue_params.delete(:assignee_id) unless issue_params[:assignee_id].present? issues = Issue.where(id: issues_ids) issues.each do |issue| next unless can?(current_user, :update_issue, issue) Issues::UpdateService.new(issue.project, current_user, issue_params).execute(issue) end { count: issues.count, success: !issues.count.zero? } end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/issues/update_service.rb0000644000175600017570000000162412672631600030061 0ustar pravipravimodule Issues class UpdateService < Issues::BaseService def execute(issue) update(issue) end def handle_changes(issue, options = {}) if has_changes?(issue, options) todo_service.mark_pending_todos_as_done(issue, current_user) end if issue.previous_changes.include?('title') || issue.previous_changes.include?('description') todo_service.update_issue(issue, current_user) end if issue.previous_changes.include?('milestone_id') create_milestone_note(issue) end if issue.previous_changes.include?('assignee_id') create_assignee_note(issue) notification_service.reassigned_issue(issue, current_user) todo_service.reassigned_issue(issue, current_user) end end def reopen_service Issues::ReopenService end def close_service Issues::CloseService end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/0000755000175600017570000000000012672631600024316 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/create_service.rb0000644000175600017570000000202112672631600027621 0ustar pravipravirequire_relative "base_service" module Files class CreateService < Files::BaseService def commit repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch, false) end def validate super if @file_path =~ Gitlab::Regex.directory_traversal_regex raise_error( 'Your changes could not be committed, because the file name ' + Gitlab::Regex.directory_traversal_regex_message ) end unless @file_path =~ Gitlab::Regex.file_path_regex raise_error( 'Your changes could not be committed, because the file name ' + Gitlab::Regex.file_path_regex_message ) end unless project.empty_repo? @file_path.slice!(0) if @file_path.start_with?('/') blob = repository.blob_at_branch(@source_branch, @file_path) if blob raise_error("Your changes could not be committed because a file with the same name already exists") end end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/base_service.rb0000644000175600017570000000436712672631600027307 0ustar pravipravimodule Files class BaseService < ::BaseService class ValidationError < StandardError; end def execute @source_project = params[:source_project] || @project @source_branch = params[:source_branch] @target_branch = params[:target_branch] @commit_message = params[:commit_message] @file_path = params[:file_path] @file_content = if params[:file_content_encoding] == 'base64' Base64.decode64(params[:file_content]) else params[:file_content] end # Validate parameters validate # Create new branch if it different from source_branch if different_branch? create_target_branch end if commit success else error("Something went wrong. Your changes were not committed") end rescue Repository::CommitError, Gitlab::Git::Repository::InvalidBlobName, GitHooksService::PreReceiveError, ValidationError => ex error(ex.message) end private def different_branch? @source_branch != @target_branch || @source_project != @project end def raise_error(message) raise ValidationError.new(message) end def validate allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(@target_branch) unless allowed raise_error("You are not allowed to push into this branch") end unless project.empty_repo? unless @source_project.repository.branch_names.include?(@source_branch) raise_error("You can only create or edit files when you are on a branch") end if different_branch? if repository.branch_names.include?(@target_branch) raise_error("Branch with such name already exists. You need to switch to this branch in order to make changes") end end end end def create_target_branch result = CreateBranchService.new(project, current_user).execute(@target_branch, @source_branch, source_project: @source_project) unless result[:status] == :success raise_error("Something went wrong when we tried to create #{@target_branch} for you: #{result[:message]}") end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/create_dir_service.rb0000644000175600017570000000072712672631600030472 0ustar pravipravirequire_relative "base_service" module Files class CreateDirService < Files::BaseService def commit repository.commit_dir(current_user, @file_path, @commit_message, @target_branch) end def validate super unless @file_path =~ Gitlab::Regex.file_path_regex raise_error( 'Your changes could not be committed, because the file path ' + Gitlab::Regex.file_path_regex_message ) end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/update_service.rb0000644000175600017570000000034712672631600027651 0ustar pravipravirequire_relative "base_service" module Files class UpdateService < Files::BaseService def commit repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch, true) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/files/delete_service.rb0000644000175600017570000000032212672631600027622 0ustar pravipravirequire_relative "base_service" module Files class DeleteService < Files::BaseService def commit repository.remove_file(current_user, @file_path, @commit_message, @target_branch) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/commits/0000755000175600017570000000000012672631600024667 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/commits/revert_service.rb0000644000175600017570000000352212672631600030245 0ustar pravipravimodule Commits class RevertService < ::BaseService class ValidationError < StandardError; end class ReversionError < StandardError; end def execute @source_project = params[:source_project] || @project @target_branch = params[:target_branch] @commit = params[:commit] @create_merge_request = params[:create_merge_request].present? validate and commit rescue Repository::CommitError, Gitlab::Git::Repository::InvalidBlobName, GitHooksService::PreReceiveError, ValidationError, ReversionError => ex error(ex.message) end def commit revert_into = @create_merge_request ? @commit.revert_branch_name : @target_branch if @create_merge_request # Temporary branch exists and contains the revert commit return success if repository.find_branch(revert_into) create_target_branch end unless repository.revert(current_user, @commit, revert_into) error_msg = "Sorry, we cannot revert this #{params[:revert_type_title]} automatically. It may have already been reverted, or a more recent commit may have updated some of its content." raise ReversionError, error_msg end success end private def create_target_branch result = CreateBranchService.new(@project, current_user) .execute(@commit.revert_branch_name, @target_branch, source_project: @source_project) if result[:status] == :error raise ReversionError, "There was an error creating the source branch: #{result[:message]}" end end def validate allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(@target_branch) unless allowed raise_error('You are not allowed to push into this branch') end true end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/compare_service.rb0000644000175600017570000000164212672631600026712 0ustar pravipravirequire 'securerandom' # Compare 2 branches for one repo or between repositories # and return Gitlab::CompareResult object that responds to commits and diffs class CompareService def execute(source_project, source_branch, target_project, target_branch, diff_options = {}) source_commit = source_project.commit(source_branch) return unless source_commit source_sha = source_commit.sha # If compare with other project we need to fetch ref first unless target_project == source_project random_string = SecureRandom.hex target_project.repository.fetch_ref( source_project.repository.path_to_repo, "refs/heads/#{source_branch}", "refs/tmp/#{random_string}/head" ) end Gitlab::CompareResult.new( Gitlab::Git::Compare.new( target_project.repository.raw_repository, target_branch, source_sha, ), diff_options ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/delete_branch_service.rb0000644000175600017570000000266012672631600030044 0ustar pravipravirequire_relative 'base_service' class DeleteBranchService < BaseService def execute(branch_name) repository = project.repository branch = repository.find_branch(branch_name) # No such branch unless branch return error('No such branch', 404) end if branch_name == repository.root_ref return error('Cannot remove HEAD branch', 405) end # Dont allow remove of protected branch if project.protected_branch?(branch_name) return error('Protected branch cant be removed', 405) end # Dont allow user to remove branch if he is not allowed to push unless current_user.can?(:push_code, project) return error('You dont have push access to repo', 405) end if repository.rm_branch(current_user, branch_name) # GitPushService handles execution of services and hooks for branch pushes success('Branch was removed') else error('Failed to remove branch') end rescue GitHooksService::PreReceiveError error('Branch deletion was rejected by Git hook') end def error(message, return_code = 400) out = super(message) out[:return_code] = return_code out end def success(message) out = super() out[:message] = message out end def build_push_data(branch) Gitlab::PushDataBuilder .build(project, current_user, branch.target, Gitlab::Git::BLANK_SHA, "#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}", []) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/create_release_service.rb0000644000175600017570000000127512672631600030231 0ustar pravipravirequire_relative 'base_service' class CreateReleaseService < BaseService def execute(tag_name, release_description) repository = project.repository existing_tag = repository.find_tag(tag_name) # Only create a release if the tag exists if existing_tag release = project.releases.find_by(tag: tag_name) if release error('Release already exists', 409) else release = project.releases.new({ tag: tag_name, description: release_description }) release.save success(release) end else error('Tag does not exist', 404) end end def success(release) out = super() out[:release] = release out end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/notification_service.rb0000644000175600017570000003272512672631600027760 0ustar pravipravi# NotificationService class # # Used for notifying users with emails about different events # # Ex. # NotificationService.new.new_issue(issue, current_user) # class NotificationService # Always notify user about ssh key added # only if ssh key is not deploy key # # This is security email so it will be sent # even if user disabled notifications def new_key(key) if key.user mailer.new_ssh_key_email(key.id).deliver_later end end # Always notify user about email added to profile def new_email(email) if email.user mailer.new_email_email(email.id).deliver_later end end # When create an issue we should send next emails: # # * issue assignee if their notification level is not Disabled # * project team members with notification level higher then Participating # def new_issue(issue, current_user) new_resource_email(issue, issue.project, 'new_issue_email') end # When we close an issue we should send next emails: # # * issue author if their notification level is not Disabled # * issue assignee if their notification level is not Disabled # * project team members with notification level higher then Participating # def close_issue(issue, current_user) close_resource_email(issue, issue.project, current_user, 'closed_issue_email') end # When we reassign an issue we should send next emails: # # * issue old assignee if their notification level is not Disabled # * issue new assignee if their notification level is not Disabled # def reassigned_issue(issue, current_user) reassign_resource_email(issue, issue.project, current_user, 'reassigned_issue_email') end # When create a merge request we should send next emails: # # * mr assignee if their notification level is not Disabled # def new_merge_request(merge_request, current_user) new_resource_email(merge_request, merge_request.target_project, 'new_merge_request_email') end # When we reassign a merge_request we should send next emails: # # * merge_request old assignee if their notification level is not Disabled # * merge_request assignee if their notification level is not Disabled # def reassigned_merge_request(merge_request, current_user) reassign_resource_email(merge_request, merge_request.target_project, current_user, 'reassigned_merge_request_email') end def close_mr(merge_request, current_user) close_resource_email(merge_request, merge_request.target_project, current_user, 'closed_merge_request_email') end def reopen_issue(issue, current_user) reopen_resource_email(issue, issue.project, current_user, 'issue_status_changed_email', 'reopened') end def merge_mr(merge_request, current_user) close_resource_email( merge_request, merge_request.target_project, current_user, 'merged_merge_request_email' ) end def reopen_mr(merge_request, current_user) reopen_resource_email( merge_request, merge_request.target_project, current_user, 'merge_request_status_email', 'reopened' ) end # Notify new user with email after creation def new_user(user, token = nil) # Don't email omniauth created users mailer.new_user_email(user.id, token).deliver_later unless user.identities.any? end # Notify users on new note in system # # TODO: split on methods and refactor # def new_note(note) return true unless note.noteable_type.present? # ignore gitlab service messages return true if note.note.start_with?('Status changed to closed') return true if note.cross_reference? && note.system == true return true if note.is_award target = note.noteable recipients = [] mentioned_users = note.mentioned_users mentioned_users.select! do |user| user.can?(:read_project, note.project) end # Add all users participating in the thread (author, assignee, comment authors) participants = if target.respond_to?(:participants) target.participants(note.author) else mentioned_users end recipients = recipients.concat(participants) # Merge project watchers recipients = add_project_watchers(recipients, note.project) # Reject users with Mention notification level, except those mentioned in _this_ note. recipients = reject_mention_users(recipients - mentioned_users, note.project) recipients = recipients + mentioned_users recipients = reject_muted_users(recipients, note.project) recipients = add_subscribed_users(recipients, note.noteable) recipients = reject_unsubscribed_users(recipients, note.noteable) recipients.delete(note.author) recipients = recipients.uniq # build notify method like 'note_commit_email' notify_method = "note_#{note.noteable_type.underscore}_email".to_sym recipients.each do |recipient| mailer.send(notify_method, recipient.id, note.id).deliver_later end end def invite_project_member(project_member, token) mailer.project_member_invited_email(project_member.id, token).deliver_later end def accept_project_invite(project_member) mailer.project_invite_accepted_email(project_member.id).deliver_later end def decline_project_invite(project_member) mailer.project_invite_declined_email( project_member.project.id, project_member.invite_email, project_member.access_level, project_member.created_by_id ).deliver_later end def new_project_member(project_member) mailer.project_access_granted_email(project_member.id).deliver_later end def update_project_member(project_member) mailer.project_access_granted_email(project_member.id).deliver_later end def invite_group_member(group_member, token) mailer.group_member_invited_email(group_member.id, token).deliver_later end def accept_group_invite(group_member) mailer.group_invite_accepted_email(group_member.id).deliver_later end def decline_group_invite(group_member) mailer.group_invite_declined_email( group_member.group.id, group_member.invite_email, group_member.access_level, group_member.created_by_id ).deliver_later end def new_group_member(group_member) mailer.group_access_granted_email(group_member.id).deliver_later end def update_group_member(group_member) mailer.group_access_granted_email(group_member.id).deliver_later end def project_was_moved(project, old_path_with_namespace) recipients = project.team.members recipients = reject_muted_users(recipients, project) recipients.each do |recipient| mailer.project_was_moved_email( project.id, recipient.id, old_path_with_namespace ).deliver_later end end protected # Get project users with WATCH notification level def project_watchers(project) project_members = project_member_notification(project) users_with_project_level_global = project_member_notification(project, Notification::N_GLOBAL) users_with_group_level_global = group_member_notification(project, Notification::N_GLOBAL) users = users_with_global_level_watch([users_with_project_level_global, users_with_group_level_global].flatten.uniq) users_with_project_setting = select_project_member_setting(project, users_with_project_level_global, users) users_with_group_setting = select_group_member_setting(project, project_members, users_with_group_level_global, users) User.where(id: users_with_project_setting.concat(users_with_group_setting).uniq).to_a end def project_member_notification(project, notification_level=nil) project_members = project.project_members if notification_level project_members.where(notification_level: notification_level).pluck(:user_id) else project_members.pluck(:user_id) end end def group_member_notification(project, notification_level) if project.group project.group.group_members.where(notification_level: notification_level).pluck(:user_id) else [] end end def users_with_global_level_watch(ids) User.where( id: ids, notification_level: Notification::N_WATCH ).pluck(:id) end # Build a list of users based on project notifcation settings def select_project_member_setting(project, global_setting, users_global_level_watch) users = project_member_notification(project, Notification::N_WATCH) # If project setting is global, add to watch list if global setting is watch global_setting.each do |user_id| if users_global_level_watch.include?(user_id) users << user_id end end users end # Build a list of users based on group notification settings def select_group_member_setting(project, project_members, global_setting, users_global_level_watch) uids = group_member_notification(project, Notification::N_WATCH) # Group setting is watch, add to users list if user is not project member users = [] uids.each do |user_id| if project_members.exclude?(user_id) users << user_id end end # Group setting is global, add to users list if global setting is watch global_setting.each do |user_id| if project_members.exclude?(user_id) && users_global_level_watch.include?(user_id) users << user_id end end users end def add_project_watchers(recipients, project) recipients.concat(project_watchers(project)).compact.uniq end # Remove users with disabled notifications from array # Also remove duplications and nil recipients def reject_muted_users(users, project = nil) reject_users(users, :disabled?, project) end # Remove users with notification level 'Mentioned' def reject_mention_users(users, project = nil) reject_users(users, :mention?, project) end # Reject users which method_name from notification object returns true. # # Example: # reject_users(users, :watch?, project) # def reject_users(users, method_name, project = nil) users = users.to_a.compact.uniq users = users.reject(&:blocked?) users.reject do |user| next user.notification.send(method_name) unless project member = project.project_members.find_by(user_id: user.id) if !member && project.group member = project.group.group_members.find_by(user_id: user.id) end # reject users who globally set mention notification and has no membership next user.notification.send(method_name) unless member # reject users who set mention notification in project next true if member.notification.send(method_name) # reject users who have N_MENTION in project and disabled in global settings member.notification.global? && user.notification.send(method_name) end end def reject_unsubscribed_users(recipients, target) return recipients unless target.respond_to? :subscriptions recipients.reject do |user| subscription = target.subscriptions.find_by_user_id(user.id) subscription && !subscription.subscribed end end def add_subscribed_users(recipients, target) return recipients unless target.respond_to? :subscriptions subscriptions = target.subscriptions if subscriptions.any? recipients + subscriptions.where(subscribed: true).map(&:user) else recipients end end def new_resource_email(target, project, method) recipients = build_recipients(target, project, target.author) recipients.each do |recipient| mailer.send(method, recipient.id, target.id).deliver_later end end def close_resource_email(target, project, current_user, method) recipients = build_recipients(target, project, current_user) recipients.each do |recipient| mailer.send(method, recipient.id, target.id, current_user.id).deliver_later end end def reassign_resource_email(target, project, current_user, method) previous_assignee_id = previous_record(target, 'assignee_id') previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id recipients = build_recipients(target, project, current_user, action: :reassign, previous_assignee: previous_assignee) recipients.each do |recipient| mailer.send( method, recipient.id, target.id, previous_assignee_id, current_user.id ).deliver_later end end def reopen_resource_email(target, project, current_user, method, status) recipients = build_recipients(target, project, current_user) recipients.each do |recipient| mailer.send(method, recipient.id, target.id, status, current_user.id).deliver_later end end def build_recipients(target, project, current_user, action: nil, previous_assignee: nil) recipients = target.participants(current_user) recipients = add_project_watchers(recipients, project) recipients = reject_mention_users(recipients, project) # Re-assign is considered as a mention of the new assignee so we add the # new assignee to the list of recipients after we rejected users with # the "on mention" notification level if action == :reassign recipients << previous_assignee if previous_assignee recipients << target.assignee end recipients = reject_muted_users(recipients, project) recipients = add_subscribed_users(recipients, target) recipients = reject_unsubscribed_users(recipients, target) recipients.delete(current_user) recipients.uniq end def mailer Notify end def previous_record(object, attribute) if object && attribute if object.previous_changes.include?(attribute) object.previous_changes[attribute].first end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/notes/0000755000175600017570000000000012672631600024344 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/notes/create_service.rb0000644000175600017570000000060412672631600027654 0ustar pravipravimodule Notes class CreateService < BaseService def execute note = project.notes.new(params) note.author = current_user note.system = false if note.save # Finish the harder work in the background NewNoteWorker.perform_in(2.seconds, note.id, params) TodoService.new.new_note(note, current_user) end note end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/notes/post_process_service.rb0000644000175600017570000000125112672631600031133 0ustar pravipravimodule Notes class PostProcessService attr_accessor :note def initialize(note) @note = note end def execute # Skip system notes, like status changes and cross-references and awards unless @note.system || @note.is_award EventCreateService.new.leave_note(@note, @note.author) @note.create_cross_references! execute_note_hooks end end def hook_data Gitlab::NoteDataBuilder.build(@note, @note.author) end def execute_note_hooks note_data = hook_data @note.project.execute_hooks(note_data, :note_hooks) @note.project.execute_services(note_data, :note_hooks) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/notes/update_service.rb0000644000175600017570000000063212672631600027674 0ustar pravipravimodule Notes class UpdateService < BaseService def execute(note) return note unless note.editable? note.update_attributes(params.merge(updated_by: current_user)) note.create_new_cross_references!(current_user) note.reset_events_cache if note.previous_changes.include?('note') TodoService.new.update_note(note, current_user) end note end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/todo_service.rb0000644000175600017570000001147012672631600026231 0ustar pravipravi# TodoService class # # Used for creating todos after certain user actions # # Ex. # TodoService.new.new_issue(issue, current_user) # class TodoService # When create an issue we should: # # * create a todo for assignee if issue is assigned # * create a todo for each mentioned user on issue # def new_issue(issue, current_user) new_issuable(issue, current_user) end # When update an issue we should: # # * mark all pending todos related to the issue for the current user as done # def update_issue(issue, current_user) create_mention_todos(issue.project, issue, current_user) end # When close an issue we should: # # * mark all pending todos related to the target for the current user as done # def close_issue(issue, current_user) mark_pending_todos_as_done(issue, current_user) end # When we reassign an issue we should: # # * create a pending todo for new assignee if issue is assigned # def reassigned_issue(issue, current_user) create_assignment_todo(issue, current_user) end # When create a merge request we should: # # * creates a pending todo for assignee if merge request is assigned # * create a todo for each mentioned user on merge request # def new_merge_request(merge_request, current_user) new_issuable(merge_request, current_user) end # When update a merge request we should: # # * create a todo for each mentioned user on merge request # def update_merge_request(merge_request, current_user) create_mention_todos(merge_request.project, merge_request, current_user) end # When close a merge request we should: # # * mark all pending todos related to the target for the current user as done # def close_merge_request(merge_request, current_user) mark_pending_todos_as_done(merge_request, current_user) end # When we reassign a merge request we should: # # * creates a pending todo for new assignee if merge request is assigned # def reassigned_merge_request(merge_request, current_user) create_assignment_todo(merge_request, current_user) end # When merge a merge request we should: # # * mark all pending todos related to the target for the current user as done # def merge_merge_request(merge_request, current_user) mark_pending_todos_as_done(merge_request, current_user) end # When create a note we should: # # * mark all pending todos related to the noteable for the note author as done # * create a todo for each mentioned user on note # def new_note(note, current_user) handle_note(note, current_user) end # When update a note we should: # # * mark all pending todos related to the noteable for the current user as done # * create a todo for each new user mentioned on note # def update_note(note, current_user) handle_note(note, current_user) end # When marking pending todos as done we should: # # * mark all pending todos related to the target for the current user as done # def mark_pending_todos_as_done(target, user) pending_todos(user, target.project, target).update_all(state: :done) end private def create_todos(project, target, author, users, action, note = nil) Array(users).each do |user| next if pending_todos(user, project, target).exists? Todo.create( project: project, user_id: user.id, author_id: author.id, target_id: target.id, target_type: target.class.name, action: action, note: note ) end end def new_issuable(issuable, author) create_assignment_todo(issuable, author) create_mention_todos(issuable.project, issuable, author) end def handle_note(note, author) # Skip system notes, notes on commit, and notes on project snippet return if note.system? || ['Commit', 'Snippet'].include?(note.noteable_type) project = note.project target = note.noteable mark_pending_todos_as_done(target, author) create_mention_todos(project, target, author, note) end def create_assignment_todo(issuable, author) if issuable.assignee && issuable.assignee != author create_todos(issuable.project, issuable, author, issuable.assignee, Todo::ASSIGNED) end end def create_mention_todos(project, issuable, author, note = nil) mentioned_users = filter_mentioned_users(project, note || issuable, author) create_todos(project, issuable, author, mentioned_users, Todo::MENTIONED, note) end def filter_mentioned_users(project, target, author) mentioned_users = target.mentioned_users.select do |user| user.can?(:read_project, project) end mentioned_users.delete(author) mentioned_users.uniq end def pending_todos(user, project, target) user.todos.pending.where( project_id: project.id, target_id: target.id, target_type: target.class.name ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/update_snippet_service.rb0000644000175600017570000000113612672631600030306 0ustar pravipraviclass UpdateSnippetService < BaseService attr_accessor :snippet def initialize(project, user, snippet, params) super(project, user, params) @snippet = snippet end def execute # check that user is allowed to set specified visibility_level new_visibility = params[:visibility_level] if new_visibility && new_visibility.to_i != snippet.visibility_level unless Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility) deny_visibility_level(snippet, new_visibility) return snippet end end snippet.update_attributes(params) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/services/delete_tag_service.rb0000644000175600017570000000207712672631600027364 0ustar pravipravirequire_relative 'base_service' class DeleteTagService < BaseService def execute(tag_name) repository = project.repository tag = repository.find_tag(tag_name) # No such tag unless tag return error('No such tag', 404) end if repository.rm_tag(tag_name) release = project.releases.find_by(tag: tag_name) release.destroy if release push_data = build_push_data(tag) EventCreateService.new.push(project, current_user, push_data) project.execute_hooks(push_data.dup, :tag_push_hooks) project.execute_services(push_data.dup, :tag_push_hooks) success('Tag was removed') else error('Failed to remove tag') end end def error(message, return_code = 400) out = super(message) out[:return_code] = return_code out end def success(message) out = super() out[:message] = message out end def build_push_data(tag) Gitlab::PushDataBuilder .build(project, current_user, tag.target, Gitlab::Git::BLANK_SHA, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", []) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/0000755000175600017570000000000012672631600022526 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/invites/0000755000175600017570000000000012672631600024207 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/invites/show.html.haml0000644000175600017570000000167712672631600027010 0ustar pravipravi- page_title "Invitation" %h3.page-title Invitation %p You have been invited - if inviter = @member.created_by by = link_to inviter.name, user_url(inviter) to join - case @member.source - when Project - project = @member.source project %strong = link_to project.name_with_namespace, namespace_project_url(project.namespace, project) - when Group - group = @member.source group %strong = link_to group.name, group_url(group) as #{@member.human_access}. - if @member.source.users.include?(current_user) %p However, you are already a member of this #{@member.source.is_a?(Group) ? "group" : "project"}. Sign in using a different account to accept the invitation. - else .actions = link_to "Accept invitation", accept_invite_url(@token), method: :post, class: "btn btn-success" = link_to "Decline", decline_invite_url(@token), method: :post, class: "btn btn-danger prepend-left-10" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/0000755000175600017570000000000012672631600023667 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/show.atom.builder0000644000175600017570000000073012672631600027156 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@user.name} activity" xml.link href: user_url(@user, :atom), rel: "self", type: "application/atom+xml" xml.link href: user_url(@user), rel: "alternate", type: "text/html" xml.id user_url(@user) xml.updated @events[0].updated_at.xmlschema if @events[0] @events.each do |event| event_to_atom(xml, event) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/calendar_activities.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/calendar_activities.html.h0000644000175600017570000000124512672631600031002 0ustar pravipravi%h4.prepend-top-20 %span.light Contributions for %strong #{@calendar_date.to_s(:short)} %ul.bordered-list - @events.sort_by(&:created_at).each do |event| %li %span.light %i.fa.fa-clock-o = event.created_at.to_s(:time) - if event.push? #{event.action_name} #{event.ref_type} #{event.ref_name} - else = event_action_name(event) - if event.target %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] at %strong - if event.project = link_to_project event.project - else = event.project_name gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/_groups.html.haml0000644000175600017570000000027512672631600027157 0ustar pravipravi.clearfix - groups.each do |group| = link_to group, class: 'profile-groups-avatars inline', title: group.name do = image_tag group_icon(group), class: 'avatar group-avatar s40' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/calendar.html.haml0000644000175600017570000000037112672631600027247 0ustar pravipravi#cal-heatmap.calendar :javascript new Calendar( #{@timestamps.to_json}, #{@starting_year}, #{@starting_month}, '#{user_calendar_activities_path}' ); .calendar-hint Summary of issues, merge requests and push events gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/users/show.html.haml0000644000175600017570000000756612672631600026473 0ustar pravipravi- page_title @user.name - page_description @user.bio - header_title @user.name, user_path(@user) - @no_container = true = content_for :meta_tags do = auto_discovery_link_tag(:atom, user_url(@user, format: :atom), title: "#{@user.name} activity") = render 'shared/show_aside' .cover-block .cover-controls - if @user == current_user = link_to profile_path, class: 'btn btn-gray' do = icon('pencil') - elsif current_user %span.report-abuse - if @user.abuse_report %button.btn.btn-danger{ title: 'Already reported for abuse', data: { toggle: 'tooltip', placement: 'left', container: 'body' }} = icon('exclamation-circle') - else = link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: 'btn btn-gray', title: 'Report abuse', data: {toggle: 'tooltip', placement: 'left', container: 'body'} do = icon('exclamation-circle') - if current_user   = link_to user_path(@user, :atom, { private_token: current_user.private_token }), class: 'btn btn-gray' do = icon('rss') .avatar-holder = link_to avatar_icon(@user, 400), target: '_blank' do = image_tag avatar_icon(@user, 90), class: "avatar s90", alt: '' .cover-title = @user.name .cover-desc %span @#{@user.username}. - if @user.bio.present? %span #{@user.bio}. %span Member since #{@user.created_at.to_s(:medium)} .cover-desc - unless @user.public_email.blank? .profile-link-holder = link_to @user.public_email, "mailto:#{@user.public_email}" - unless @user.skype.blank? .profile-link-holder = link_to "skype:#{@user.skype}", title: "Skype" do = icon('skype') - unless @user.linkedin.blank? .profile-link-holder = link_to "https://www.linkedin.com/in/#{@user.linkedin}", title: "LinkedIn" do = icon('linkedin-square') - unless @user.twitter.blank? .profile-link-holder = link_to "https://twitter.com/#{@user.twitter}", title: "Twitter" do = icon('twitter-square') - unless @user.website_url.blank? .profile-link-holder = link_to @user.short_website_url, @user.full_website_url - unless @user.location.blank? .profile-link-holder = icon('map-marker') = @user.location %ul.nav-links.center %li.active = link_to "#activity", 'data-toggle' => 'tab' do Activity - if @groups.any? %li = link_to "#groups", 'data-toggle' => 'tab' do Groups - if @contributed_projects.present? %li = link_to "#contributed", 'data-toggle' => 'tab' do Contributed projects - if @projects.present? %li = link_to "#personal", 'data-toggle' => 'tab' do Personal projects %div{ class: container_class } .tab-content .tab-pane.active#activity .gray-content-block.white.second-block %div{ class: container_class } .user-calendar %h4.center.light %i.fa.fa-spinner.fa-spin .user-calendar-activities .content_list = spinner - if @groups.any? .tab-pane#groups %ul.content-list - @groups.each do |group| = render 'shared/groups/group', group: group - if @contributed_projects.present? .tab-pane#contributed .contributed-projects = render 'shared/projects/list', projects: @contributed_projects.sort_by(&:star_count).reverse, projects_limit: 10, stars: true, avatar: true - if @projects.present? .tab-pane#personal .personal-projects = render 'shared/projects/list', projects: @projects.sort_by(&:star_count).reverse, projects_limit: 10, stars: true, avatar: true :javascript $(".user-calendar").load("#{user_calendar_path}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/0000755000175600017570000000000012672631600023456 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/index.html.haml0000644000175600017570000000271212672631600026375 0ustar pravipravi%div %h1 GitLab Community Edition - if user_signed_in? %span= Gitlab::VERSION %small= Gitlab::REVISION = version_status_badge %p.slead GitLab is open source software to collaborate on code. %br Manage git repositories with fine-grained access controls that keep your code secure. %br Perform code reviews and enhance collaboration with merge requests. %br Each project can also have an issue tracker and a wiki. %br Used by more than 100,000 organizations, GitLab is the most popular solution to manage git repositories on-premises. %br Read more about GitLab at #{link_to promo_host, promo_url, target: '_blank'}. - if current_application_settings.help_page_text.present? %hr = markdown(current_application_settings.help_page_text) %hr .row .col-md-8 .documentation-index = preserve do = markdown(@help_index) .col-md-4 .panel.panel-default .panel-heading Quick help %ul.well-list %li= link_to 'See our website for getting help', promo_url + '/getting-help/' %li= link_to 'Use the search bar on the top of this page', '#', onclick: 'Shortcuts.focusSearch(event)' %li= link_to 'Use shortcuts', '#', onclick: 'Shortcuts.showHelp(event)' %li= link_to 'Get a support subscription', 'https://about.gitlab.com/pricing/' %li= link_to 'Compare GitLab editions', 'https://about.gitlab.com/features/#compare' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/ui.html.haml0000644000175600017570000001445712672631600025714 0ustar pravipravi- page_title "UI Development Kit", "Help" - lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed fermentum nisi sapien, non consequat lectus aliquam ultrices. Suspendisse sodales est euismod nunc condimentum, a consectetur diam ornare." .gitlab-ui-dev-kit %h1 GitLab UI development kit %p.light Use page inspector in your browser to check element classes and structure of examples below. %hr %ul %li = link_to 'Blocks', '#blocks' %li = link_to 'Lists', '#lists' %li = link_to 'Tables', '#tables' %li = link_to 'Nav', '#nav' %li = link_to 'Buttons', '#buttons' %li = link_to 'Panels', '#panels' %li = link_to 'Alerts', '#alerts' %li = link_to 'Forms', '#forms' %li = link_to 'Files', '#file' %li = link_to 'Markdown', '#markdown' %h2#blocks Blocks %h4 %code .gray-content-block .gray-content-block.middle-block %h4 Normal block inside content = lorem .gray-content-block.second-block %h4 Second block = lorem %h4 %code .cover-block %br .cover-block .avatar-holder = image_tag avatar_icon('admin@example.com', 90), class: "avatar s90", alt: '' .cover-title John Smith .cover-desc = lorem .cover-controls = link_to '#', class: 'btn btn-gray' do = icon('pencil')   = link_to '#', class: 'btn btn-gray' do = icon('rss') %h2#lists Lists %h4 %code .content-list %ul.content-list %li One item %li One item %li One item %h4 %code .well-list %ul.well-list %li One item %li One item %li One item %h4 %code .panel .well-list .panel.panel-default .panel-heading Your list %ul.well-list %li One item %li One item %li One item %h4 %code .bordered-list %ul.bordered-list %li One item %li One item %li One item %h2#tables Tables .example %table.table %thead %tr %th # %th First Name %th Last Name %th Username %tbody %tr %td 1 %td Mark %td Otto %td @mdo %tr %td 2 %td Jacob %td Thornton %td @fat %tr %td 3 %td Larry %td the Bird %td @twitter %h2#navs Navigation %h4 %code .top-area %p Holder for top page navigation. Includes navigation, search field, sorting and button .example .top-area %ul.nav-links %li.active %a Open %li %a Closed .nav-controls = text_field_tag 'sample', nil, class: 'form-control' .dropdown %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %span Sort by name %b.caret %ul.dropdown-menu %li %a Sort by date = link_to 'New issue', '#', class: 'btn btn-new' %h4 %code .nav-links %p Only nav links without button and search .example %ul.nav-links %li.active %a Open %li %a Closed %h2#buttons Buttons .example %button.btn.btn-default{:type => "button"} Default %button.btn.btn-gray{:type => "button"} Gray %button.btn.btn-primary{:type => "button"} Primary %button.btn.btn-success{:type => "button"} Success %button.btn.btn-info{:type => "button"} Info %button.btn.btn-warning{:type => "button"} Warning %button.btn.btn-danger{:type => "button"} Danger %button.btn.btn-link{:type => "button"} Link %h2#panels Panels .row .col-md-6 .panel.panel-success .panel-heading Success .panel-body = lorem .panel.panel-primary .panel-heading Primary .panel-body = lorem .panel.panel-info .panel-heading Info .panel-body = lorem .col-md-6 .panel.panel-warning .panel-heading Warning .panel-body = lorem .panel.panel-danger .panel-heading Danger .panel-body = lorem %h2#alert Alerts .row .col-md-6 .alert.alert-success = lorem .alert.alert-primary = lorem .alert.alert-info = lorem .col-md-6 .alert.alert-warning = lorem .alert.alert-danger = lorem %h2#forms Forms %h4 %code form.horizontal-form %form.form-horizontal .form-group %label.col-sm-2.control-label{:for => "inputEmail3"} Email .col-sm-10 %input#inputEmail3.form-control{:placeholder => "Email", :type => "email"}/ .form-group %label.col-sm-2.control-label{:for => "inputPassword3"} Password .col-sm-10 %input#inputPassword3.form-control{:placeholder => "Password", :type => "password"}/ .form-group .col-sm-offset-2.col-sm-10 .checkbox %label %input{:type => "checkbox"}/ Remember me .form-group .col-sm-offset-2.col-sm-10 %button.btn.btn-default{:type => "submit"} Sign in %h4 %code form %form .form-group %label{:for => "exampleInputEmail1"} Email address %input#exampleInputEmail1.form-control{:placeholder => "Enter email", :type => "email"}/ .form-group %label{:for => "exampleInputPassword1"} Password %input#exampleInputPassword1.form-control{:placeholder => "Password", :type => "password"}/ .checkbox %label %input{:type => "checkbox"}/ Remember me %button.btn.btn-default{:type => "submit"} Sign in %h2#file File %h4 %code .file-holder - blob = Snippet.new(content: "Wow\nSuch\nFile") .example .file-holder .file-title Awesome file .file-actions .btn-group %a.btn Edit %a.btn.btn-danger Remove .file-contenta.code = render 'shared/file_highlight', blob: blob %h2#markdown Markdown %h4 %code .md or .wiki and others Markdown rendering has a bit different css and presented in next UI elements: %ul %li comment %li issue, merge request description %li wiki page %li help page You can check how markdown rendered at #{link_to 'Markdown help page', help_page_path("markdown", "markdown")}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/_shortcuts.html.haml0000644000175600017570000001514712672631600027471 0ustar pravipravi#modal-shortcuts.modal{tabindex: -1} .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h4 Keyboard Shortcuts %small = link_to '(Show all)', '#', class: 'js-more-help-button' .modal-body.shortcuts-cheatsheet .col-lg-4 %table.shortcut-mappings %tbody %tr %th %th Global Shortcuts %tr %td.shortcut .key s %td Focus Search %tr %td.shortcut .key ? %td Show this dialog %tbody %tr %th %th Project Files browsing %tr %td.shortcut .key %i.fa.fa-arrow-up %td Move selection up %tr %td.shortcut .key %i.fa.fa-arrow-down %td Move selection down %tr %td.shortcut .key enter %td Open Selection %tbody %tr %th %th Finding Project File %tr %td.shortcut .key %i.fa.fa-arrow-up %td Move selection up %tr %td.shortcut .key %i.fa.fa-arrow-down %td Move selection down %tr %td.shortcut .key enter %td Open Selection %tr %td.shortcut .key esc %td Go back .col-lg-4 %table.shortcut-mappings %tbody{ class: 'hidden-shortcut project', style: 'display:none' } %tr %th %th Global Dashboard %tr %td.shortcut .key g .key a %td Go to the activity feed %tr %td.shortcut .key g .key p %td Go to projects %tr %td.shortcut .key g .key i %td Go to issues %tr %td.shortcut .key g .key m %td Go to merge requests %tbody %tr %th %th Project %tr %td.shortcut .key g .key p %td Go to the project's home page %tr %td.shortcut .key g .key e %td Go to the project's activity feed %tr %td.shortcut .key g .key f %td Go to files %tr %td.shortcut .key g .key c %td Go to commits %tr %td.shortcut .key g .key b %td Go to builds %tr %td.shortcut .key g .key n %td Go to network graph %tr %td.shortcut .key g .key g %td Go to graphs %tr %td.shortcut .key g .key i %td Go to issues %tr %td.shortcut .key g .key m %td Go to merge requests %tr %td.shortcut .key g .key s %td Go to snippets %tr %td.shortcut .key t %td Go to finding file .col-lg-4 %table.shortcut-mappings %tbody{ class: 'hidden-shortcut network', style: 'display:none' } %tr %th %th Network Graph %tr %td.shortcut .key %i.fa.fa-arrow-left \/ .key h %td Scroll left %tr %td.shortcut .key %i.fa.fa-arrow-right \/ .key l %td Scroll right %tr %td.shortcut .key %i.fa.fa-arrow-up \/ .key k %td Scroll up %tr %td.shortcut .key %i.fa.fa-arrow-down \/ .key j %td Scroll down %tr %td.shortcut .key shift %i.fa.fa-arrow-up \/ .key shift k %td Scroll to top %tr %td.shortcut .key shift %i.fa.fa-arrow-down \/ .key shift j %td Scroll to bottom %tbody{ class: 'hidden-shortcut issues', style: 'display:none' } %tr %th %th Issues %tr %td.shortcut .key a %td Change assignee %tr %td.shortcut .key m %td Change milestone %tr %td.shortcut .key r %td Reply (quoting selected text) %tbody{ class: 'hidden-shortcut merge_requests', style: 'display:none' } %tr %th %th Merge Requests %tr %td.shortcut .key a %td Change assignee %tr %td.shortcut .key m %td Change milestone %tr %td.shortcut .key r %td Reply (quoting selected text) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/shortcuts.js.haml0000644000175600017570000000015112672631600026767 0ustar pravipravi:plain $("body").append("#{escape_javascript(render('shortcuts'))}"); $("#modal-shortcuts").modal(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/help/show.html.haml0000644000175600017570000000027312672631600026246 0ustar pravipravi- page_title @file.humanize, *@category.split("/").reverse.map(&:humanize) .documentation.wiki = markdown @markdown.gsub('$your_email', current_user.try(:email) || "email@example.com") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_report_mailer/0000755000175600017570000000000012672631600026551 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_report_mailer/notify.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_report_mailer/notify.html.0000644000175600017570000000053212672631600031025 0ustar pravipravi%p #{link_to @abuse_report.user.name, user_url(@abuse_report.user)} (@#{@abuse_report.user.username}) was reported for abuse by #{link_to @abuse_report.reporter.name, user_url(@abuse_report.reporter)} (@#{@abuse_report.reporter.username}). %blockquote = @abuse_report.message %p = link_to "View details", admin_abuse_reports_url ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_report_mailer/notify.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_report_mailer/notify.text.0000644000175600017570000000034512672631600031047 0ustar pravipravi#{@abuse_report.user.name} (@#{@abuse_report.user.username}) was reported for abuse by #{@abuse_report.reporter.name} (@#{@abuse_report.reporter.username}). \ > #{@abuse_report.message} \ View details: #{admin_abuse_reports_url} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/0000755000175600017570000000000012672631600023773 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/_category.html.haml0000644000175600017570000000641712672631600027565 0ustar pravipravi%ul.nav-links.search-filter - if @project %li{class: ("active" if @scope == 'blobs')} = link_to search_filter_path(scope: 'blobs') do = icon('code fw') %span Code %span.badge = @search_results.blobs_count %li{class: ("active" if @scope == 'issues')} = link_to search_filter_path(scope: 'issues') do = icon('exclamation-circle fw') %span Issues %span.badge = @search_results.issues_count %li{class: ("active" if @scope == 'merge_requests')} = link_to search_filter_path(scope: 'merge_requests') do = icon('tasks fw') %span Merge requests %span.badge = @search_results.merge_requests_count %li{class: ("active" if @scope == 'milestones')} = link_to search_filter_path(scope: 'milestones') do = icon('clock-o fw') %span Milestones %span.badge = @search_results.milestones_count %li{class: ("active" if @scope == 'notes')} = link_to search_filter_path(scope: 'notes') do = icon('comments fw') %span Comments %span.badge = @search_results.notes_count %li{class: ("active" if @scope == 'wiki_blobs')} = link_to search_filter_path(scope: 'wiki_blobs') do = icon('book fw') %span Wiki %span.badge = @search_results.wiki_blobs_count %li{class: ("active" if @scope == 'commits')} = link_to search_filter_path(scope: 'commits') do = icon('history fw') %span Commits %span.badge = @search_results.commits_count - elsif @show_snippets %li{class: ("active" if @scope == 'snippet_blobs')} = link_to search_filter_path(scope: 'snippet_blobs', snippets: true, group_id: nil, project_id: nil) do = icon('code fw') %span Snippet Contents %span.badge = @search_results.snippet_blobs_count %li{class: ("active" if @scope == 'snippet_titles')} = link_to search_filter_path(scope: 'snippet_titles', snippets: true, group_id: nil, project_id: nil) do = icon('book fw') %span Titles and Filenames %span.badge = @search_results.snippet_titles_count - else %li{class: ("active" if @scope == 'projects')} = link_to search_filter_path(scope: 'projects') do = icon('bookmark fw') %span Projects %span.badge = @search_results.projects_count %li{class: ("active" if @scope == 'issues')} = link_to search_filter_path(scope: 'issues') do = icon('exclamation-circle fw') %span Issues %span.badge = @search_results.issues_count %li{class: ("active" if @scope == 'merge_requests')} = link_to search_filter_path(scope: 'merge_requests') do = icon('tasks fw') %span Merge requests %span.badge = @search_results.merge_requests_count %li{class: ("active" if @scope == 'milestones')} = link_to search_filter_path(scope: 'milestones') do = icon('clock-o fw') %span Milestones %span.badge = @search_results.milestones_count gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/_form.html.haml0000644000175600017570000000120612672631600026702 0ustar pravipravi= form_tag search_path, method: :get do |f| = hidden_field_tag :project_id, params[:project_id] = hidden_field_tag :group_id, params[:group_id] = hidden_field_tag :snippets, params[:snippets] = hidden_field_tag :scope, params[:scope] .search-holder.clearfix .input-group = search_field_tag :search, params[:search], placeholder: "Search for projects, issues etc", class: "form-control search-text-input", id: "dashboard_search", autofocus: true, spellcheck: false %span.input-group-btn = button_tag 'Search', class: "btn btn-primary" - unless params[:snippets].eql? 'true' %br = render 'filter' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/0000755000175600017570000000000012672631600025474 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_milestone.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_milestone.html.h0000644000175600017570000000046712672631600030755 0ustar pravipravi.search-result-row %h4 = link_to [milestone.project.namespace.becomes(Namespace), milestone.project, milestone] do %span.term.str-truncated= milestone.title - if milestone.description.present? .description.term = preserve do = search_md_sanitize(markdown(milestone.description))gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_issue.html.haml0000644000175600017570000000073312672631600030574 0ustar pravipravi.search-result-row %h4 = link_to [issue.project.namespace.becomes(Namespace), issue.project, issue] do %span.term.str-truncated= issue.title .pull-right ##{issue.iid} - if issue.description.present? .description.term = preserve do = search_md_sanitize(markdown(issue.description, { project: issue.project })) %span.light #{issue.project.name_with_namespace} - if issue.closed? .pull-right %span.label.label-danger Closed ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_snippet_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_snippet_title.ht0000644000175600017570000000154412672631600031057 0ustar pravipravi.search-result-row %h4.snippet-title.term = link_to reliable_snippet_path(snippet_title) do = truncate(snippet_title.title, length: 60) - if snippet_title.private? %span.label.label-gray %i.fa.fa-lock private %span.cgray.monospace.tiny.pull-right.term = snippet_title.file_name %small.pull-right.cgray - if snippet_title.project_id? = link_to snippet_title.project.name_with_namespace, namespace_project_path(snippet_title.project.namespace, snippet_title.project) .snippet-info = "##{snippet_title.id}" %span by = link_to user_snippets_path(snippet_title.author) do = image_tag avatar_icon(snippet_title.author_email), class: "avatar avatar-inline s16", alt: '' = snippet_title.author_name %span.light #{time_ago_with_tooltip(snippet_title.created_at)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_note.html.haml0000644000175600017570000000156512672631600030415 0ustar pravipravi- project = note.project .search-result-row %h5.note-search-caption.str-truncated %i.fa.fa-comment = link_to_member(project, note.author, avatar: false) commented on - if note.for_commit? = link_to project do = project.name_with_namespace · = link_to namespace_project_commit_path(project.namespace, project, note.commit_id, anchor: dom_id(note)) do Commit #{truncate_sha(note.commit_id)} - else = link_to project do = project.name_with_namespace · %span #{note.noteable_type.titleize} ##{note.noteable.iid} · = link_to [project.namespace.becomes(Namespace), project, note.noteable, anchor: dom_id(note)] do = note.noteable.title .note-search-result .term = preserve do = search_md_sanitize(markdown(note.note, {no_header_anchors: true})) ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_snippet_blob.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_snippet_blob.htm0000644000175600017570000000365412672631600031035 0ustar pravipravi- snippet_blob = chunk_snippet(snippet_blob, @search_term) - snippet = snippet_blob[:snippet_object] - snippet_chunks = snippet_blob[:snippet_chunks] .search-result-row %span = snippet.title by = link_to user_snippets_path(snippet.author) do = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: '' = snippet.author_name %span.light #{time_ago_with_tooltip(snippet.created_at)} %h4.snippet-title - snippet_path = reliable_snippet_path(snippet) = link_to snippet_path do .file-holder .file-title %i.fa.fa-file %strong= snippet.file_name - if markup?(snippet.file_name) .file-content.wiki - snippet_chunks.each do |chunk| - unless chunk[:data].empty? = render_markup(snippet.file_name, chunk[:data]) - else .file-content.code .nothing-here-block Empty file - else .file-content.code.js-syntax-highlight .line-numbers - snippet_chunks.each do |chunk| - unless chunk[:data].empty? - chunk[:data].lines.to_a.size.times do |index| - offset = defined?(chunk[:start_line]) ? chunk[:start_line] : 1 - i = index + offset = link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}", class: "diff-line-num" do %i.fa.fa-link = i - unless snippet == snippet_chunks.last %a.diff-line-num = "." %pre.code %code - snippet_chunks.each do |chunk| - unless chunk[:data].empty? = chunk[:data] - unless chunk == snippet_chunks.last %a = "..." - else .file-content.code .nothing-here-block Empty file gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_commit.html.haml0000644000175600017570000000013312672631600030726 0ustar pravipravi.search-result-row = render 'projects/commits/commit', project: @project, commit: commit gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_blob.html.haml0000644000175600017570000000065412672631600030364 0ustar pravipravi- blob = @project.repository.parse_search_result(blob) .blob-result .file-holder .file-title = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(blob.ref, blob.filename), :anchor => "L" + blob.startline.to_s) do %i.fa.fa-file %strong = blob.filename .file-content.code.term = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_empty.html.haml0000644000175600017570000000017312672631600030600 0ustar pravipravi.search_box .search_glyph %h4 = icon('search') We couldn't find any results matching %code #{@search_term} ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_merge_request.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_merge_request.ht0000644000175600017570000000120212672631600031032 0ustar pravipravi.search-result-row %h4 = link_to [merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request] do %span.term.str-truncated= merge_request.title .pull-right ##{merge_request.iid} - if merge_request.description.present? .description.term = preserve do = search_md_sanitize(markdown(merge_request.description, { project: merge_request.project })) %span.light #{merge_request.project.name_with_namespace} .pull-right - if merge_request.merged? %span.label.label-primary Merged - elsif merge_request.closed? %span.label.label-danger Closed ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_wiki_blob.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/results/_wiki_blob.html.h0000644000175600017570000000061712672631600030714 0ustar pravipravi- wiki_blob = @project.repository.parse_search_result(wiki_blob) .blob-result .file-holder .file-title = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_blob.filename) do %i.fa.fa-file %strong = wiki_blob.filename .file-content.code.term = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/show.html.haml0000644000175600017570000000022412672631600026557 0ustar pravipravi- page_title @search_term .prepend-top-default = render 'search/form' - if @search_term = render 'search/category' = render 'search/results' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/_filter.html.haml0000644000175600017570000000203512672631600027225 0ustar pravipravi.dropdown.inline %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} %span.light Group: - if @group.present? %strong= @group.name - else Any %b.caret %ul.dropdown-menu %li = link_to search_filter_path(group_id: nil) do Any - current_user.authorized_groups.sort_by(&:name).each do |group| %li = link_to search_filter_path(group_id: group.id, project_id: nil) do = group.name .dropdown.inline.prepend-left-10.project-filter %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} %span.light Project: - if @project.present? %strong= @project.name_with_namespace - else Any %b.caret %ul.dropdown-menu %li = link_to search_filter_path(project_id: nil) do Any - current_user.authorized_projects.sort_by(&:name_with_namespace).each do |project| %li = link_to search_filter_path(project_id: project.id, group_id: nil) do = project.name_with_namespace gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/search/_results.html.haml0000644000175600017570000000140512672631600027441 0ustar pravipravi- if @search_results.empty? = render partial: "search/results/empty" - else .gray-content-block Search results for %code = @search_term - unless @show_snippets - if @project in project #{link_to @project.name_with_namespace, [@project.namespace.becomes(Namespace), @project]} - elsif @group in group #{link_to @group.name, @group} .results.prepend-top-10 .search-results - if @scope == 'projects' .term = render 'shared/projects/list', projects: @objects - else = render partial: "search/results/#{@scope.singularize}", collection: @objects = paginate @objects, theme: 'gitlab' :javascript $(".search-results .term").highlight("#{escape_javascript(params[:search])}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/0000755000175600017570000000000012672631600024321 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/0000755000175600017570000000000012672631600025563 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_last_page.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_last_page.html.0000644000175600017570000000062112672631600030624 0ustar pravipravi-# Link to the "Last" page -# available local variables -# url: url to the last page -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote %li.last = link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {remote: remote} ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_next_page.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_next_page.html.0000644000175600017570000000077212672631600030646 0ustar pravipravi-# Link to the "Next" page -# available local variables -# url: url to the next page -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote - if current_page.last? %li{ class: "next disabled" } %span= raw(t 'views.pagination.next') - else %li{ class: "next" } = link_to raw(t 'views.pagination.next'), url, rel: 'next', remote: remote gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_page.html.haml0000644000175600017570000000075112672631600030447 0ustar pravipravi-# Link showing page number -# available local variables -# page: a page object for "this" page -# url: url to this page -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote %li{class: "page#{' active' if page.current?}"} = link_to page, url, {remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil} ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_paginator.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_paginator.html.0000644000175600017570000000150412672631600030652 0ustar pravipravi-# The container tag -# available local variables -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote -# paginator: the paginator that renders the pagination tags inside = paginator.render do %div.gl-pagination %ul.pagination.clearfix - unless current_page.first? = first_page_tag unless num_pages < 5 # As kaminari will always show the first 5 pages = prev_page_tag - each_page do |page| - if page.left_outer? || page.right_outer? || page.inside_window? = page_tag page - elsif !page.was_truncated? = gap_tag = next_page_tag - unless current_page.last? = last_page_tag unless num_pages < 5 ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_first_page.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_first_page.html0000644000175600017570000000062412672631600030735 0ustar pravipravi-# Link to the "First" page -# available local variables -# url: url to the first page -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote %li.first = link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_gap.html.haml0000644000175600017570000000054412672631600030302 0ustar pravipravi-# Non-link tag that stands for skipped pages... -# available local variables -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote %li{class: "page"} %span.page.gap = raw(t 'views.pagination.truncate') ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_prev_page.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/kaminari/gitlab/_prev_page.html.0000644000175600017570000000101312672631600030631 0ustar pravipravi-# Link to the "Previous" page -# available local variables -# url: url to the previous page -# current_page: a page object for the currently displayed page -# num_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote - if current_page.first? %li{ class: "prev disabled" } %span= raw(t 'views.pagination.previous') - else %li{ class: "prev" } = link_to raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/0000755000175600017570000000000012672631600023616 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/0000755000175600017570000000000012672631600026304 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/edit.html.ham0000644000175600017570000000026012672631600030661 0ustar pravipravi- page_title "Edit", @application.name, "Applications" %h3.page-title Edit application - @url = admin_application_path(@application) = render 'form', application: @application gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/new.html.haml0000644000175600017570000000021212672631600030676 0ustar pravipravi- page_title "New Application" %h3.page-title New application - @url = admin_applications_path = render 'form', application: @application ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/_delete_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/_delete_form.0000644000175600017570000000041012672631600030724 0ustar pravipravi- submit_btn_css ||= 'btn btn-link btn-remove btn-sm' = form_tag admin_application_path(application) do %input{:name => "_method", :type => "hidden", :value => "delete"}/ = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/index.html.ha0000644000175600017570000000150412672631600030670 0ustar pravipravi- page_title "Applications" %h3.page-title System OAuth applications %p.light System OAuth applications don't belong to any user and can only be managed by admins %hr %p= link_to 'New Application', new_admin_application_path, class: 'btn btn-success' %table.table.table-striped %thead %tr %th Name %th Callback URL %th Clients %th %th %tbody.oauth-applications - @applications.each do |application| %tr{:id => "application_#{application.id}"} %td= link_to application.name, admin_application_path(application) %td= application.redirect_uri %td= application.access_tokens.map(&:resource_owner_id).uniq.count %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' %td= render 'delete_form', application: application ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/_form.html.ha0000644000175600017570000000215412672631600030665 0ustar pravipravi= form_for [:admin, @application], url: @url, html: {class: 'form-horizontal', role: 'form'} do |f| - if application.errors.any? .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × - application.errors.full_messages.each do |msg| %p= msg = content_tag :div, class: 'form-group' do = f.label :name, class: 'col-sm-2 control-label' .col-sm-10 = f.text_field :name, class: 'form-control' = doorkeeper_errors_for application, :name = content_tag :div, class: 'form-group' do = f.label :redirect_uri, class: 'col-sm-2 control-label' .col-sm-10 = f.text_area :redirect_uri, class: 'form-control' = doorkeeper_errors_for application, :redirect_uri %span.help-block Use one line per URI - if Doorkeeper.configuration.native_redirect_uri %span.help-block Use %code= Doorkeeper.configuration.native_redirect_uri for local tests .form-actions = f.submit 'Submit', class: "btn btn-save wide" = link_to "Cancel", admin_applications_path, class: "btn btn-default" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/applications/show.html.ham0000644000175600017570000000125612672631600030722 0ustar pravipravi- page_title @application.name, "Applications" %h3.page-title Application: #{@application.name} .table-holder %table.table %tr %td Application Id %td %code#application_id= @application.uid %tr %td Secret: %td %code#secret= @application.secret %tr %td Callback url %td - @application.redirect_uri.split.each do |uri| %div %span.monospace= uri .form-actions = link_to 'Edit', edit_admin_application_path(@application), class: 'btn btn-primary wide pull-left' = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/runners/0000755000175600017570000000000012672631600025312 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/runners/index.html.haml0000644000175600017570000000401012672631600030222 0ustar pravipravi%p.lead %span To register a new runner you should enter the following registration token. With this token the runner will request a unique runner token and use that for future communication. Registration token is %code{ id: 'runners-token' } #{current_application_settings.runners_registration_token} .bs-callout.clearfix .pull-left %p You can reset runners registration token by pressing a button below. %p = button_to reset_runners_token_admin_application_settings_path, method: :put, class: 'btn btn-default', data: { confirm: 'Are you sure you want to reset registration token?' } do = icon('refresh') Reset runners registration token .bs-callout %p A 'runner' is a process which runs a build. You can setup as many runners as you need. %br Runners can be placed on separate users, servers, and even on your local machine. %br %div %span Each runner can be in one of the following states: %ul %li %span.label.label-success shared \- run builds from all unassigned projects %li %span.label.label-info specific \- run builds from assigned projects %li %span.label.label-danger paused \- runner will not receive any new builds .append-bottom-20.clearfix .pull-left = form_tag admin_runners_path, id: 'runners-search', class: 'form-inline', method: :get do .form-group = search_field_tag :search, params[:search], class: 'form-control', placeholder: 'Runner description or token', spellcheck: false = submit_tag 'Search', class: 'btn' .pull-right.light Runners with last contact less than a minute ago: #{@active_runners_cnt} %br .table-holder %table.table %thead %tr %th Type %th Runner token %th Description %th Projects %th Builds %th Tags %th Last contact %th - @runners.each do |runner| = render "admin/runners/runner", runner: runner = paginate @runners gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/runners/update.js.haml0000644000175600017570000000013112672631600030045 0ustar pravipravi:plain $("#runner_#{@runner.id}").replaceWith("#{escape_javascript(render(@runner))}") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/runners/_runner.html.haml0000644000175600017570000000300012672631600030561 0ustar pravipravi%tr{id: dom_id(runner)} %td - if runner.shared? %span.label.label-success shared - else %span.label.label-info specific - unless runner.active? %span.label.label-danger paused %td = link_to admin_runner_path(runner) do = runner.short_sha %td .runner-description = runner.description %span (#{link_to 'edit', '#', class: 'edit-runner-link'}) .runner-description-form.hide = form_for [:admin, runner], remote: true, html: { class: 'form-inline' } do |f| .form-group = f.text_field :description, class: 'form-control' = f.submit 'Save', class: 'btn' %span (#{link_to 'cancel', '#', class: 'cancel'}) %td - if runner.shared? \- - else = runner.projects.count(:all) %td #{runner.builds.count(:all)} %td - runner.tag_list.each do |tag| %span.label.label-primary = tag %td - if runner.contacted_at #{time_ago_in_words(runner.contacted_at)} ago - else Never %td .pull-right = link_to 'Edit', admin_runner_path(runner), class: 'btn btn-sm'   - if runner.active? = link_to 'Pause', [:pause, :admin, runner], data: { confirm: "Are you sure?" }, method: :get, class: 'btn btn-danger btn-sm' - else = link_to 'Resume', [:resume, :admin, runner], method: :get, class: 'btn btn-success btn-sm' = link_to 'Remove', [:admin, runner], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/runners/show.html.haml0000644000175600017570000000740512672631600030106 0ustar pravipravi= content_for :title do %h3.project-title Runner ##{@runner.id} .pull-right - if @runner.shared? %span.runner-state.runner-state-shared Shared - else %span.runner-state.runner-state-specific Specific - if @runner.shared? .bs-callout.bs-callout-success %h4 This runner will process builds from ALL UNASSIGNED projects %p If you want runners to build only specific projects, enable them in the table below. Keep in mind that this is a one way transition. - else .bs-callout.bs-callout-info %h4 This runner will process builds only from ASSIGNED projects %p You can't make this a shared runner. %hr = form_for @runner, url: admin_runner_path(@runner), html: { class: 'form-horizontal' } do |f| .form-group = label_tag :token, class: 'control-label' do Token .col-sm-10 = f.text_field :token, class: 'form-control', readonly: true .form-group = label_tag :description, class: 'control-label' do Description .col-sm-10 = f.text_field :description, class: 'form-control' .form-group = label_tag :tag_list, class: 'control-label' do Tags .col-sm-10 = f.text_field :tag_list, value: @runner.tag_list.to_s, class: 'form-control' .help-block You can setup builds to only use runners with specific tags .form-actions = f.submit 'Save', class: 'btn btn-save' .row .col-md-6 %h4 Restrict projects for this runner - if @runner.projects.any? %table.table %thead %tr %th Assigned projects %th - @runner.runner_projects.each do |runner_project| - project = runner_project.project - if project %tr.alert-info %td %strong = project.name_with_namespace %td .pull-right = link_to 'Disable', [:admin, project.namespace.becomes(Namespace), project, runner_project], method: :delete, class: 'btn btn-danger btn-xs' %table.table %thead %tr %th Project %th %tr %td = form_tag admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do .form-group = search_field_tag :search, params[:search], class: 'form-control', spellcheck: false = submit_tag 'Search', class: 'btn' %td - @projects.each do |project| %tr %td = project.name_with_namespace %td .pull-right = form_for [:admin, project.namespace.becomes(Namespace), project, project.runner_projects.new] do |f| = f.hidden_field :runner_id, value: @runner.id = f.submit 'Enable', class: 'btn btn-xs' = paginate @projects .col-md-6 %h4 Recent builds served by this runner %table.table.builds.runner-builds %thead %tr %th Build %th Status %th Project %th Commit %th Finished at - @builds.each do |build| - project = build.project %tr.build %td.id - if project = link_to namespace_project_build_path(project.namespace, project, build) do %strong ##{build.id} - else %strong ##{build.id} %td.status = ci_status_with_icon(build.status) %td.status - if project = project.name_with_namespace %td.build-link - if project = link_to ci_status_path(build.commit) do %strong #{build.commit.short_sha} %td.timestamp - if build.finished_at %span #{time_ago_in_words build.finished_at} ago gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/hooks/0000755000175600017570000000000012672631600024741 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/hooks/index.html.haml0000644000175600017570000000270312672631600027660 0ustar pravipravi- page_title "System Hooks" %h3.page-title System hooks %p.light #{link_to "System hooks ", help_page_path("system_hooks", "system_hooks"), class: "vlink"} can be used for binding events when GitLab creates a User or Project. %hr = form_for @hook, as: :hook, url: admin_hooks_path, html: { class: 'form-horizontal' } do |f| -if @hook.errors.any? .alert.alert-danger - @hook.errors.full_messages.each do |msg| %p= msg .form-group = f.label :url, "URL:", class: 'control-label' .col-sm-10 = f.text_field :url, class: "form-control" .form-group = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox' .col-sm-10 .checkbox = f.label :enable_ssl_verification do = f.check_box :enable_ssl_verification %strong Enable SSL verification .form-actions = f.submit "Add System Hook", class: "btn btn-create" %hr -if @hooks.any? .panel.panel-default .panel-heading System hooks (#{@hooks.count}) %ul.well-list - @hooks.each do |hook| %li .list-item-name %strong= hook.url %p SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"} .pull-right = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn btn-sm" = link_to 'Remove', admin_hook_path(hook), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-remove btn-sm" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/0000755000175600017570000000000012672631600024757 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/_profile.html.haml0000644000175600017570000000173512672631600030372 0ustar pravipravi.panel.panel-default .panel-heading Profile %ul.well-list %li %span.light Member since %strong= user.created_at.to_s(:medium) - unless user.public_email.blank? %li %span.light E-mail: %strong= link_to user.public_email, "mailto:#{user.public_email}" - unless user.skype.blank? %li %span.light Skype: %strong= link_to user.skype, "skype:#{user.skype}" - unless user.linkedin.blank? %li %span.light LinkedIn: %strong= link_to user.linkedin, "https://www.linkedin.com/in/#{user.linkedin}" - unless user.twitter.blank? %li %span.light Twitter: %strong= link_to user.twitter, "https://twitter.com/#{user.twitter}" - unless user.website_url.blank? %li %span.light Website: %strong= link_to user.short_website_url, user.full_website_url - unless user.location.blank? %li %span.light Location: %strong= user.location gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/edit.html.haml0000644000175600017570000000014712672631600027514 0ustar pravipravi- page_title "Edit", @user.name, "Users" %h3.page-title Edit user: #{@user.name} %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/new.html.haml0000644000175600017570000000010612672631600027353 0ustar pravipravi- page_title "New User" %h3.page-title New user %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/_head.html.haml0000644000175600017570000000165212672631600027631 0ustar pravipravi%h3.page-title = @user.name - if @user.blocked? %span.cred (Blocked) - if @user.admin %span.cred (Admin) .pull-right - unless @user == current_user || @user.blocked? = link_to 'Impersonate', impersonate_admin_user_path(@user), method: :post, class: "btn btn-nr btn-grouped btn-info" = link_to edit_admin_user_path(@user), class: "btn btn-nr btn-grouped" do %i.fa.fa-pencil-square-o Edit %hr %ul.nav-links = nav_link(path: 'users#show') do = link_to "Account", admin_user_path(@user) = nav_link(path: 'users#groups') do = link_to "Groups", groups_admin_user_path(@user) = nav_link(path: 'users#projects') do = link_to "Projects", projects_admin_user_path(@user) = nav_link(path: 'users#keys') do = link_to "SSH keys", keys_admin_user_path(@user) = nav_link(controller: :identities) do = link_to "Identities", admin_user_identities_path(@user) .append-bottom-default gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/projects.html.haml0000644000175600017570000000303212672631600030414 0ustar pravipravi- page_title "Projects", @user.name, "Users" = render 'admin/users/head' - if @user.groups.any? .panel.panel-default .panel-heading Group projects %ul.well-list - @user.groups.each do |group| %li %strong= group.name – access to #{pluralize(group.projects.count, 'project')} .row .col-md-6 - if @personal_projects.present? = render 'admin/users/projects', projects: @personal_projects - else .nothing-here-block This user has no personal projects. .col-md-6 .panel.panel-default .panel-heading Joined projects (#{@joined_projects.count}) %ul.well-list - @joined_projects.sort_by(&:name_with_namespace).each do |project| - member = project.team.find_member(@user.id) %li.project_member .list-item-name = link_to admin_namespace_project_path(project.namespace, project), class: dom_class(project) do = project.name_with_namespace - if member .pull-right - if member.owner? %span.light Owner - else %span.light= member.human_access - if member.respond_to? :project = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_from_project_team_message(project, member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from project' do %i.fa.fa-times gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/index.html.haml0000644000175600017570000001161612672631600027701 0ustar pravipravi- page_title "Users" = render 'shared/show_aside' .admin-filter %ul.nav-links %li{class: "#{'active' unless params[:filter]}"} = link_to admin_users_path do Active %small.badge= number_with_delimiter(User.active.count) %li{class: "#{'active' if params[:filter] == "admins"}"} = link_to admin_users_path(filter: "admins") do Admins %small.badge= number_with_delimiter(User.admins.count) %li.filter-two-factor-enabled{class: "#{'active' if params[:filter] == 'two_factor_enabled'}"} = link_to admin_users_path(filter: 'two_factor_enabled') do 2FA Enabled %small.badge= number_with_delimiter(User.with_two_factor.count) %li.filter-two-factor-disabled{class: "#{'active' if params[:filter] == 'two_factor_disabled'}"} = link_to admin_users_path(filter: 'two_factor_disabled') do 2FA Disabled %small.badge= number_with_delimiter(User.without_two_factor.count) %li{class: "#{'active' if params[:filter] == "blocked"}"} = link_to admin_users_path(filter: "blocked") do Blocked %small.badge= number_with_delimiter(User.blocked.count) %li{class: "#{'active' if params[:filter] == "wop"}"} = link_to admin_users_path(filter: "wop") do Without projects %small.badge= number_with_delimiter(User.without_projects.count) .gray-content-block.second-block .pull-right .dropdown.inline %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_name %b.caret %ul.dropdown-menu %li = link_to admin_users_path(sort: sort_value_name, filter: params[:filter]) do = sort_title_name = link_to admin_users_path(sort: sort_value_recently_signin, filter: params[:filter]) do = sort_title_recently_signin = link_to admin_users_path(sort: sort_value_oldest_signin, filter: params[:filter]) do = sort_title_oldest_signin = link_to admin_users_path(sort: sort_value_recently_created, filter: params[:filter]) do = sort_title_recently_created = link_to admin_users_path(sort: sort_value_oldest_created, filter: params[:filter]) do = sort_title_oldest_created = link_to admin_users_path(sort: sort_value_recently_updated, filter: params[:filter]) do = sort_title_recently_updated = link_to admin_users_path(sort: sort_value_oldest_updated, filter: params[:filter]) do = sort_title_oldest_updated = link_to 'New User', new_admin_user_path, class: "btn btn-new" = form_tag admin_users_path, method: :get, class: 'form-inline' do .form-group = search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control', spellcheck: false = hidden_field_tag "filter", params[:filter] = button_tag class: 'btn btn-primary' do %i.fa.fa-search .panel.panel-default %ul.well-list - @users.each do |user| %li .list-item-name - if user.blocked? %i.fa.fa-lock.cred - else %i.fa.fa-user.cgreen = link_to user.name, [:admin, user] - if user.admin? %strong.cred (Admin) - if user == current_user %span.cred It's you! .pull-right %span.light %i.fa.fa-envelope = mail_to user.email, user.email, class: 'light'   .pull-right = link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: 'btn-grouped btn btn-xs' - unless user == current_user - if user.ldap_blocked? = link_to '#', title: 'Cannot unblock LDAP blocked users', data: {toggle: 'tooltip'}, class: 'btn-grouped btn btn-xs btn-success disabled' do %i.fa.fa-lock Unblock - elsif user.blocked? = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: 'btn-grouped btn btn-xs btn-success' - else = link_to 'Block', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: 'btn-grouped btn btn-xs btn-warning' - if user.access_locked? = link_to 'Unlock', unlock_admin_user_path(user), method: :put, class: 'btn-grouped btn btn-xs btn-success', data: { confirm: 'Are you sure?' } - if user.can_be_removed? = link_to 'Destroy', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! All issues, merge requests and groups linked to this user will also be removed! Maybe block the user instead? Are you sure?" }, method: :delete, class: 'btn-grouped btn btn-xs btn-remove' = paginate @users, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/_form.html.haml0000644000175600017570000000643512672631600027677 0ustar pravipravi.user_new = form_for [:admin, @user], html: { class: 'form-horizontal fieldset-form' } do |f| -if @user.errors.any? #error_explanation .alert.alert-danger - @user.errors.full_messages.each do |msg| %p= msg %fieldset %legend Account .form-group = f.label :name, class: 'control-label' .col-sm-10 = f.text_field :name, required: true, autocomplete: "off", class: 'form-control' %span.help-inline * required .form-group = f.label :username, class: 'control-label' .col-sm-10 = f.text_field :username, required: true, autocomplete: "off", class: 'form-control' %span.help-inline * required .form-group = f.label :email, class: 'control-label' .col-sm-10 = f.text_field :email, required: true, autocomplete: "off", class: 'form-control' %span.help-inline * required - if @user.new_record? %fieldset %legend Password .form-group = f.label :password, class: 'control-label' .col-sm-10 %strong Reset link will be generated and sent to the user. %br User will be forced to set the password on first sign in. - else %fieldset %legend Password .form-group = f.label :password, class: 'control-label' .col-sm-10= f.password_field :password, disabled: f.object.force_random_password, class: 'form-control' .form-group = f.label :password_confirmation, class: 'control-label' .col-sm-10= f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control' %fieldset %legend Access .form-group = f.label :projects_limit, class: 'control-label' .col-sm-10= f.number_field :projects_limit, class: 'form-control' .form-group = f.label :can_create_group, class: 'control-label' .col-sm-10= f.check_box :can_create_group .form-group = f.label :admin, class: 'control-label' - if current_user == @user .col-sm-10= f.check_box :admin, disabled: true .col-sm-10 You cannot remove your own admin rights - else .col-sm-10= f.check_box :admin %fieldset %legend Profile .form-group = f.label :avatar, class: 'control-label' .col-sm-10 = f.file_field :avatar .form-group = f.label :skype, class: 'control-label' .col-sm-10= f.text_field :skype, class: 'form-control' .form-group = f.label :linkedin, class: 'control-label' .col-sm-10= f.text_field :linkedin, class: 'form-control' .form-group = f.label :twitter, class: 'control-label' .col-sm-10= f.text_field :twitter, class: 'form-control' .form-group = f.label :website_url, 'Website', class: 'control-label' .col-sm-10= f.text_field :website_url, class: 'form-control' .form-actions - if @user.new_record? = f.submit 'Create user', class: "btn btn-create" = link_to 'Cancel', admin_users_path, class: "btn btn-cancel" - else = f.submit 'Save changes', class: "btn btn-save" = link_to 'Cancel', admin_user_path(@user), class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/_projects.html.haml0000644000175600017570000000112312672631600030552 0ustar pravipravi- if local_assigns.has_key?(:contributed_projects) && contributed_projects.present? .panel.panel-default.contributed-projects .panel-heading Projects contributed to = render 'shared/projects/list', projects: contributed_projects.sort_by(&:star_count).reverse, projects_limit: 5, stars: true, avatar: false - if local_assigns.has_key?(:projects) && projects.present? .panel.panel-default .panel-heading Personal projects = render 'shared/projects/list', projects: projects.sort_by(&:star_count).reverse, projects_limit: 10, stars: true, avatar: false gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/keys.html.haml0000644000175600017570000000016512672631600027542 0ustar pravipravi- page_title "Keys", @user.name, "Users" = render 'admin/users/head' = render 'profiles/keys/key_table', admin: true gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/show.html.haml0000644000175600017570000001501412672631600027546 0ustar pravipravi- page_title @user.name, "Users" = render 'admin/users/head' .row .col-md-6 .panel.panel-default .panel-heading = @user.name %ul.well-list %li = image_tag avatar_icon(@user, 60), class: "avatar s60" %li %span.light Profile page: %strong = link_to user_path(@user) do = @user.username = render 'admin/users/profile', user: @user .panel.panel-default .panel-heading Account: %ul.well-list %li %span.light Name: %strong= @user.name %li %span.light Username: %strong = @user.username %li %span.light Email: %strong = mail_to @user.email - @user.emails.each do |email| %li %span.light Secondary email: %strong= email.email = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn-xs btn btn-remove pull-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do %i.fa.fa-times %li.two-factor-status %span.light Two-factor Authentication: %strong{class: @user.two_factor_enabled? ? 'cgreen' : 'cred'} - if @user.two_factor_enabled? Enabled = link_to 'Disable', disable_two_factor_admin_user_path(@user), data: {confirm: 'Are you sure?'}, method: :patch, class: 'btn btn-xs btn-remove pull-right', title: 'Disable Two-factor Authentication' - else Disabled %li %span.light Can create groups: %strong = @user.can_create_group ? "Yes" : "No" %li %span.light Personal projects limit: %strong = @user.projects_limit %li %span.light Member since: %strong = @user.created_at.to_s(:medium) - if @user.confirmed_at %li %span.light Confirmed at: %strong = @user.confirmed_at.to_s(:medium) - else %li %span.light Confirmed: %strong.cred No %li %span.light Current sign-in IP: %strong - if @user.current_sign_in_ip = @user.current_sign_in_ip - else never %li %span.light Current sign-in at: %strong - if @user.current_sign_in_at = @user.current_sign_in_at.to_s(:medium) - else never %li %span.light Last sign-in IP: %strong - if @user.last_sign_in_ip = @user.last_sign_in_ip - else never %li %span.light Last sign-in at: %strong - if @user.last_sign_in_at = @user.last_sign_in_at.to_s(:medium) - else never %li %span.light Sign-in count: %strong = @user.sign_in_count - if @user.ldap_user? %li %span.light LDAP uid: %strong = @user.ldap_identity.extern_uid - if @user.created_by %li %span.light Created by: %strong = link_to @user.created_by.name, [:admin, @user.created_by] .col-md-6 - unless @user == current_user - unless @user.confirmed? .panel.panel-info .panel-heading Confirm user .panel-body - if @user.unconfirmed_email.present? - email = " (#{@user.unconfirmed_email})" %p This user has an unconfirmed email address#{email}. You may force a confirmation. %br = link_to 'Confirm user', confirm_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } - if @user.blocked? .panel.panel-info .panel-heading This user is blocked .panel-body %p Blocking user has the following effects: %ul %li User will not be able to login %li User will not be able to access git repositories %li Personal projects will be left %li Owned groups will be left %br = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } - else .panel.panel-warning .panel-heading Block this user .panel-body %p Blocking user has the following effects: %ul %li User will not be able to login %li User will not be able to access git repositories %li User will be removed from joined projects and groups %li Personal projects will be left %li Owned groups will be left %br = link_to 'Block user', block_admin_user_path(@user), data: { confirm: 'USER WILL BE BLOCKED! Are you sure?' }, method: :put, class: "btn btn-warning" - if @user.access_locked? .panel.panel-info .panel-heading This account has been locked .panel-body %p This user has been temporarily locked due to excessive number of failed logins. You may manually unlock the account. %br = link_to 'Unlock user', unlock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } .panel.panel-danger .panel-heading Remove user .panel-body - if @user.can_be_removed? %p Deleting a user has the following effects: %ul %li All user content like authored issues, snippets, comments will be removed - rp = @user.personal_projects.count - unless rp.zero? %li #{pluralize rp, 'personal project'} will be removed and cannot be restored %br = link_to 'Remove user', [:admin, @user], data: { confirm: "USER #{@user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-remove" - else - if @user.solo_owned_groups.present? %p This user is currently an owner in these groups: %strong #{@user.solo_owned_groups.map(&:name).join(', ')} %p You must transfer ownership or delete these groups before you can delete this user. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/users/groups.html.haml0000644000175600017570000000155012672631600030105 0ustar pravipravi- page_title "Groups", @user.name, "Users" = render 'admin/users/head' - if @user.group_members.present? .panel.panel-default .panel-heading Groups: %ul.well-list - @user.group_members.each do |group_member| - group = group_member.group %li.group_member %span{class: ("list-item-name" unless group_member.owner?)} %strong= link_to group.name, admin_group_path(group) .pull-right %span.light= group_member.human_access - unless group_member.owner? = link_to group_group_member_path(group, group_member), data: { confirm: remove_user_from_group_message(group, group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do %i.fa.fa-times.fa-inverse - else .nothing-here-block This user has no groups. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/services/0000755000175600017570000000000012672631600025441 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/services/edit.html.haml0000644000175600017570000000010112672631600030164 0ustar pravipravi- page_title @service.title, "Service Templates" = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/services/index.html.haml0000644000175600017570000000120212672631600030351 0ustar pravipravi- page_title "Service Templates" %h3.page-title Service templates %p.light Service template allows you to set default values for project services .table-holder %table.table %thead %tr %th %th Service %th Description %th Last edit - @services.sort_by(&:title).each do |service| %tr %td = icon("copy", class: 'clgray') %td = link_to edit_admin_application_settings_service_path(service.id) do %strong= service.title %td = service.description %td.light = time_ago_in_words service.updated_at ago gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/services/_form.html.haml0000644000175600017570000000050612672631600030352 0ustar pravipravi%h3.page-title = @service.title %p #{@service.description} template = form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'form-horizontal fieldset-form' } do |form| = render 'shared/service_settings', form: form .form-actions = form.submit 'Save', class: 'btn btn-save' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/background_jobs/0000755000175600017570000000000012672631600026752 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/background_jobs/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/background_jobs/show.html.0000644000175600017570000000265012672631600030701 0ustar pravipravi- page_title "Background Jobs" %h3.page-title Background Jobs %p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing %hr .panel.panel-default .panel-heading Sidekiq running processes .panel-body - if @sidekiq_processes.empty? %h4.cred %i.fa.fa-exclamation-triangle There are no running sidekiq processes. Please restart GitLab - else .table-holder %table.table %thead %th USER %th PID %th CPU %th MEM %th STATE %th START %th COMMAND %tbody - @sidekiq_processes.each do |process| - next unless process.match(/(sidekiq \d+\.\d+\.\d+.+$)/) - data = process.strip.split(' ') %tr %td= gitlab_config.user - 5.times do %td= data.shift %td= data.join(' ') .clearfix %p %i.fa.fa-exclamation-circle If '[25 of 25 busy]' is shown, restart GitLab with 'sudo service gitlab reload'. %p %i.fa.fa-exclamation-circle If more than one sidekiq process is listed, stop GitLab, kill the remaining sidekiq processes (sudo pkill -u #{gitlab_config.user} -f sidekiq) and restart GitLab. .panel.panel-default %iframe{src: sidekiq_path, width: '100%', height: 970, style: "border: none"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/0000755000175600017570000000000012672631600027447 5ustar pravipravi././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/edit.ht0000644000175600017570000000006312672631600030730 0ustar pravipravi- page_title "Broadcast Messages" = render 'form' ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/index.h0000644000175600017570000000202512672631600030726 0ustar pravipravi- page_title "Broadcast Messages" %h3.page-title Broadcast Messages %p.light Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more. = render 'form' %br.clearfix -if @broadcast_messages.any? %table.table %thead %tr %th Status %th Preview %th Starts %th Ends %th   %tbody - @broadcast_messages.each do |message| %tr %td = broadcast_message_status(message) %td = broadcast_message(message) %td = message.starts_at %td = message.ends_at %td = link_to icon('pencil-square-o'), edit_admin_broadcast_message_path(message), title: 'Edit', class: 'btn btn-xs' = link_to icon('times'), admin_broadcast_message_path(message), method: :delete, remote: true, title: 'Remove', class: 'js-remove-tr btn btn-xs btn-danger' = paginate @broadcast_messages, theme: 'gitlab' ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/_form.h0000644000175600017570000000337412672631600030731 0ustar pravipravi.broadcast-message-preview{ style: broadcast_message_style(@broadcast_message) } = icon('bullhorn') .js-broadcast-message-preview = render_broadcast_message(@broadcast_message.message.presence || "Your message here") = form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form form-horizontal js-requires-input'} do |f| -if @broadcast_message.errors.any? .alert.alert-danger - @broadcast_message.errors.full_messages.each do |msg| %p= msg .form-group = f.label :message, class: 'control-label' .col-sm-10 = f.text_area :message, class: "form-control js-quick-submit js-autosize", required: true, data: { preview_path: preview_admin_broadcast_messages_path } .form-group.js-toggle-colors-container .col-sm-10.col-sm-offset-2 = link_to 'Customize colors', '#', class: 'js-toggle-colors-link' .form-group.js-toggle-colors-container.hide = f.label :color, "Background Color", class: 'control-label' .col-sm-10 = f.color_field :color, class: "form-control" .form-group.js-toggle-colors-container.hide = f.label :font, "Font Color", class: 'control-label' .col-sm-10 = f.color_field :font, class: "form-control" .form-group = f.label :starts_at, class: 'control-label' .col-sm-10.datetime-controls = f.datetime_select :starts_at, {}, class: 'form-control form-control-inline' .form-group = f.label :ends_at, class: 'control-label' .col-sm-10.datetime-controls = f.datetime_select :ends_at, {}, class: 'form-control form-control-inline' .form-actions - if @broadcast_message.persisted? = f.submit "Update broadcast message", class: "btn btn-create" - else = f.submit "Add broadcast message", class: "btn btn-create" ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/preview.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/broadcast_messages/preview0000644000175600017570000000012512672631600031051 0ustar pravipravi$('.js-broadcast-message-preview').html("#{j(render_broadcast_message(@message))}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/0000755000175600017570000000000012672631600025135 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/edit.html.haml0000644000175600017570000000015112672631600027665 0ustar pravipravi- page_title "Edit", @group.name, "Groups" %h3.page-title Edit group: #{@group.name} %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/new.html.haml0000644000175600017570000000010612672631600027531 0ustar pravipravi- page_title "New Group" %h3.page-title New group %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/index.html.haml0000644000175600017570000000404212672631600030052 0ustar pravipravi- page_title "Groups" %h3.page-title Groups (#{number_with_delimiter(@groups.total_count)}) = link_to 'New Group', new_admin_group_path, class: "btn btn-new pull-right" %p.light Group allows you to keep projects organized. Use groups for uniting related projects. %hr = form_tag admin_groups_path, method: :get, class: 'form-inline' do = hidden_field_tag :sort, @sort .form-group = text_field_tag :name, params[:name], class: "form-control" = button_tag "Search", class: "btn submit btn-primary" .pull-right .dropdown.inline %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_created %b.caret %ul.dropdown-menu %li = link_to admin_groups_path(sort: sort_value_recently_created) do = sort_title_recently_created = link_to admin_groups_path(sort: sort_value_oldest_created) do = sort_title_oldest_created = link_to admin_groups_path(sort: sort_value_recently_updated) do = sort_title_recently_updated = link_to admin_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %hr %ul.bordered-list - @groups.each do |group| %li .clearfix .pull-right.prepend-top-10 = link_to 'Edit', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: "btn btn-sm" = link_to 'Destroy', [:admin, group], data: {confirm: "REMOVE #{group.name}? Are you sure?"}, method: :delete, class: "btn btn-sm btn-remove" %h4 = link_to [:admin, group] do %i.fa.fa-folder = group.name → %span.monospace %strong #{group.path}/ .clearfix %p = truncate group.description, length: 150 .clearfix %p.light #{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')} = paginate @groups, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/_form.html.haml0000644000175600017570000000147212672631600030051 0ustar pravipravi= form_for [:admin, @group], html: { class: "form-horizontal" } do |f| - if @group.errors.any? .alert.alert-danger %span= @group.errors.full_messages.first = render 'shared/group_form', f: f .form-group.group-description-holder = f.label :avatar, "Group avatar", class: 'control-label' .col-sm-10 = render 'shared/choose_group_avatar_button', f: f - if @group.new_record? .form-group .col-sm-offset-2.col-sm-10 .alert.alert-info = render 'shared/group_tips' .form-actions = f.submit 'Create group', class: "btn btn-create" = link_to 'Cancel', admin_groups_path, class: "btn btn-cancel" - else .form-actions = f.submit 'Save changes', class: "btn btn-save" = link_to 'Cancel', admin_group_path(@group), class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/groups/show.html.haml0000644000175600017570000000631712672631600027732 0ustar pravipravi- page_title @group.name, "Groups" %h3.page-title Group: #{@group.name} = link_to edit_admin_group_path(@group), class: "btn pull-right" do %i.fa.fa-pencil-square-o Edit %hr .row .col-md-6 .panel.panel-default .panel-heading Group info: %ul.well-list %li = image_tag group_icon(@group), class: "avatar s60" %li %span.light Name: %strong= @group.name %li %span.light Path: %strong = @group.path %li %span.light Description: %strong = @group.description %li %span.light Created on: %strong = @group.created_at.to_s(:medium) .panel.panel-default .panel-heading %h3.panel-title Projects %span.badge #{@group.projects.count} %ul.well-list - @projects.each do |project| %li %strong = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] %span.label.label-gray = repository_size(project) %span.pull-right.light %span.monospace= project.path_with_namespace + ".git" .panel-footer = paginate @projects, param_name: 'projects_page', theme: 'gitlab' .col-md-6 - if can?(current_user, :admin_group_member, @group) .panel.panel-default .panel-heading Add user(s) to the group: .panel-body.form-holder %p.light Read more about project permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" = form_tag members_update_admin_group_path(@group), id: "new_project_member", class: "bulk_import", method: :put do %div = users_select_tag(:user_ids, multiple: true, email_user: true, scope: :all) %div.prepend-top-10 = select_tag :access_level, options_for_select(GroupMember.access_level_roles), class: "project-access-select select2" %hr = button_tag 'Add users to group', class: "btn btn-create" .panel.panel-default .panel-heading %h3.panel-title Members %span.badge #{@group.group_members.count} %ul.well-list.group-users-list - @members.each do |member| - user = member.user %li{class: dom_class(member), id: (dom_id(user) if user)} .list-item-name - if user %strong = link_to user.name, admin_user_path(user) - else %strong = member.invite_email (invited) %span.pull-right.light = member.human_access - if can?(current_user, :destroy_group_member, member) = link_to group_group_member_path(@group, member), data: { confirm: remove_user_from_group_message(@group, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do %i.fa.fa-minus.fa-inverse .panel-footer = paginate @members, param_name: 'members_page', theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/logs/0000755000175600017570000000000012672631600024562 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/logs/show.html.haml0000644000175600017570000000165612672631600027360 0ustar pravipravi- page_title "Logs" - loggers = [Gitlab::GitLogger, Gitlab::AppLogger, Gitlab::ProductionLogger, Gitlab::SidekiqLogger] %ul.nav-links.log-tabs - loggers.each do |klass| %li{ class: (klass == Gitlab::GitLogger ? 'active' : '') } = link_to klass::file_name, "##{klass::file_name_noext}", 'data-toggle' => 'tab' .gray-content-block To prevent performance issues admin logs output the last 2000 lines .tab-content - loggers.each do |klass| .tab-pane{ class: (klass == Gitlab::GitLogger ? 'active' : ''), id: klass::file_name_noext } .file-holder#README .file-title %i.fa.fa-file = klass::file_name .pull-right = link_to '#', class: 'log-bottom' do %i.fa.fa-arrow-down Scroll down .file-content.logs %ol - klass.read_latest.each do |line| %li %p= line gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/deploy_keys/0000755000175600017570000000000012672631600026145 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/deploy_keys/new.html.haml0000644000175600017570000000157512672631600030554 0ustar pravipravi- page_title "New Deploy Key" %h3.page-title New public deploy key %hr %div = form_for [:admin, @deploy_key], html: { class: 'deploy-key-form form-horizontal' } do |f| -if @deploy_key.errors.any? .alert.alert-danger %ul - @deploy_key.errors.full_messages.each do |msg| %li= msg .form-group = f.label :title, class: "control-label" .col-sm-10= f.text_field :title, class: 'form-control' .form-group = f.label :key, class: "control-label" .col-sm-10 %p.light Paste a machine public key here. Read more about how to generate it = link_to "here", help_page_path("ssh", "README") = f.text_area :key, class: "form-control thin_area", rows: 5 .form-actions = f.submit 'Create', class: "btn-create btn" = link_to "Cancel", admin_deploy_keys_path, class: "btn btn-cancel" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/deploy_keys/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/deploy_keys/index.html.ham0000644000175600017570000000165412672631600030714 0ustar pravipravi- page_title "Deploy Keys" .panel.panel-default .panel-heading Public deploy keys (#{@deploy_keys.count}) .controls = link_to 'New Deploy Key', new_admin_deploy_key_path, class: "btn btn-new btn-sm" - if @deploy_keys.any? .table-holder %table.table %thead.panel-heading %tr %th Title %th Fingerprint %th Added at %th %tbody - @deploy_keys.each do |deploy_key| %tr %td %strong= deploy_key.title %td %code.key-fingerprint= deploy_key.fingerprint %td %span.cgray added #{time_ago_with_tooltip(deploy_key.created_at)} %td = link_to 'Remove', admin_deploy_key_path(deploy_key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-sm btn-remove delete-key pull-right" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/dashboard/0000755000175600017570000000000012672631600025545 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/dashboard/index.html.haml0000644000175600017570000000757512672631600030500 0ustar pravipravi.admin-dashboard .row .col-md-4 %h4 Statistics %hr %p Forks %span.light.pull-right = number_with_delimiter(ForkedProjectLink.count) %p Issues %span.light.pull-right = number_with_delimiter(Issue.count) %p Merge Requests %span.light.pull-right = number_with_delimiter(MergeRequest.count) %p Notes %span.light.pull-right = number_with_delimiter(Note.count) %p Snippets %span.light.pull-right = number_with_delimiter(Snippet.count) %p SSH Keys %span.light.pull-right = number_with_delimiter(Key.count) %p Milestones %span.light.pull-right = number_with_delimiter(Milestone.count) %p Active Users %span.light.pull-right = number_with_delimiter(User.active.count) .col-md-4 %h4 Features %hr %p Sign up %span.light.pull-right = boolean_to_icon signup_enabled? %p LDAP %span.light.pull-right = boolean_to_icon Gitlab.config.ldap.enabled %p Gravatar %span.light.pull-right = boolean_to_icon gravatar_enabled? %p OmniAuth %span.light.pull-right = boolean_to_icon Gitlab.config.omniauth.enabled %p Reply by email %span.light.pull-right = boolean_to_icon Gitlab::IncomingEmail.enabled? .col-md-4 %h4 Components - if current_application_settings.version_check_enabled .pull-right = version_status_badge %hr %p GitLab %span.pull-right = Gitlab::VERSION %p GitLab Shell %span.pull-right = Gitlab::Shell.new.version %p GitLab API %span.pull-right = API::API::version %p Git %span.pull-right = Gitlab::Git.version %p Ruby %span.pull-right #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} %p Rails %span.pull-right #{Rails::VERSION::STRING} %p = Gitlab::Database.adapter_name %span.pull-right = Gitlab::Database.version %hr .row .col-sm-4 .light-well %h4 Projects .data = link_to admin_namespaces_projects_path do %h1= number_with_delimiter(Project.count) %hr = link_to('New Project', new_project_path, class: "btn btn-new") .col-sm-4 .light-well %h4 Users .data = link_to admin_users_path do %h1= number_with_delimiter(User.count) %hr = link_to 'New User', new_admin_user_path, class: "btn btn-new" .col-sm-4 .light-well %h4 Groups .data = link_to admin_groups_path do %h1= number_with_delimiter(Group.count) %hr = link_to 'New Group', new_admin_group_path, class: "btn btn-new" .row.prepend-top-10 .col-md-4 %h4 Latest projects %hr - @projects.each do |project| %p = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated' %span.light.pull-right #{time_ago_with_tooltip(project.created_at)} .col-md-4 %h4 Latest users %hr - @users.each do |user| %p = link_to [:admin, user], class: 'str-truncated' do = user.name %span.light.pull-right #{time_ago_with_tooltip(user.created_at)} .col-md-4 %h4 Latest groups %hr - @groups.each do |group| %p = link_to [:admin, group], class: 'str-truncated' do = group.name %span.light.pull-right #{time_ago_with_tooltip(group.created_at)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/projects/0000755000175600017570000000000012672631600025447 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/projects/index.html.haml0000644000175600017570000000760612672631600030375 0ustar pravipravi- page_title "Projects" = render 'shared/show_aside' .row.prepend-top-default %aside.col-md-3 .admin-filter = form_tag admin_namespaces_projects_path, method: :get, class: '' do .form-group = label_tag :name, 'Name:' = text_field_tag :name, params[:name], class: "form-control" .form-group = label_tag :namespace_id, "Namespace" = namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large' .form-group %strong Activity .checkbox = label_tag :with_push do = check_box_tag :with_push, 1, params[:with_push] %span Projects with push events .checkbox = label_tag :abandoned do = check_box_tag :abandoned, 1, params[:abandoned] %span No activity over 6 month .checkbox = label_tag :with_archived do = check_box_tag :with_archived, 1, params[:with_archived] %span Show archived projects %fieldset %strong Visibility level: .visibility-levels - Project.visibility_levels.each do |label, level| .checkbox %label = check_box_tag 'visibility_levels[]', level, params[:visibility_levels].present? && params[:visibility_levels].include?(level.to_s) %span.descr = visibility_level_icon(level) = label %hr = hidden_field_tag :sort, params[:sort] = button_tag "Search", class: "btn submit btn-primary" = link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel" %section.col-md-9 .panel.panel-default .panel-heading Projects (#{@projects.total_count}) .controls .dropdown.inline %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_created %b.caret %ul.dropdown-menu %li = link_to admin_namespaces_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created = link_to admin_namespaces_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created = link_to admin_namespaces_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated = link_to admin_namespaces_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated = link_to admin_namespaces_projects_path(sort: sort_value_largest_repo) do = sort_title_largest_repo = link_to 'New Project', new_project_path, class: "btn btn-sm btn-success" %ul.well-list - @projects.each do |project| %li .list-item-name %span{ class: visibility_level_color(project.visibility_level) } = visibility_level_icon(project.visibility_level) = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] .pull-right - if project.archived %span.label.label-warning archived %span.label.label-gray = repository_size(project) = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" = link_to 'Destroy', [project.namespace.becomes(Namespace), project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-sm btn-remove" - if @projects.blank? .nothing-here-block 0 projects matches = paginate @projects, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/projects/show.html.haml0000644000175600017570000001120612672631600030235 0ustar pravipravi- page_title @project.name_with_namespace, "Projects" %h3.page-title Project: #{@project.name_with_namespace} = link_to edit_project_path(@project), class: "btn btn-nr pull-right" do %i.fa.fa-pencil-square-o Edit %hr .row .col-md-6 .panel.panel-default .panel-heading Project info: %ul.well-list %li %span.light Name: %strong = link_to @project.name, project_path(@project) %li %span.light Namespace: %strong - if @project.namespace = link_to @project.namespace.human_name, [:admin, @project.group || @project.owner] - else Global %li %span.light Owned by: %strong - if @project.owner = link_to @project.owner_name, [:admin, @project.owner] - else (deleted) %li %span.light Created by: %strong = @project.creator.try(:name) || '(deleted)' %li %span.light Created on: %strong = @project.created_at.to_s(:medium) %li %span.light http: %strong = link_to @project.http_url_to_repo, project_path(@project) %li %span.light ssh: %strong = link_to @project.ssh_url_to_repo, project_path(@project) - if @project.repository.exists? %li %span.light fs: %strong = @repository.path_to_repo %li %span.light Size %strong = repository_size(@project) %li %span.light last commit: %strong = last_commit(@project) - else %li %span.light repository: %strong.cred does not exist - if @project.archived? %li %span.light archived: %strong repository is read-only %li %span.light access: %strong %span{ class: visibility_level_color(@project.visibility_level) } = visibility_level_icon(@project.visibility_level) = visibility_level_label(@project.visibility_level) .panel.panel-default .panel-heading Transfer project .panel-body = form_for @project, url: transfer_admin_namespace_project_path(@project.namespace, @project), method: :put, html: { class: 'form-horizontal' } do |f| .form-group = f.label :new_namespace_id, "Namespace", class: 'control-label' .col-sm-10 = namespace_select_tag :new_namespace_id, selected: params[:namespace_id], class: 'input-large' .form-group .col-sm-offset-2.col-sm-10 = f.submit 'Transfer', class: 'btn btn-primary' .col-md-6 - if @group .panel.panel-default .panel-heading %strong #{@group.name} group members (#{@group.group_members.count}) .pull-right = link_to admin_group_path(@group), class: 'btn btn-xs' do %i.fa.fa-pencil-square-o %ul.well-list - @group_members.each do |member| = render 'groups/group_members/group_member', member: member, show_controls: false .panel-footer = paginate @group_members, param_name: 'group_members_page', theme: 'gitlab' .panel.panel-default .panel-heading Project members %small (#{@project.users.count}) .pull-right = link_to namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-xs" do %i.fa.fa-pencil-square-o Manage Access %ul.well-list.project_members - @project_members.each do |project_member| - user = project_member.user %li.project_member .list-item-name - if user %strong = link_to user.name, admin_user_path(user) - else %strong = project_member.invite_email (invited) .pull-right - if project_member.owner? %span.light Owner - else %span.light= project_member.human_access = link_to namespace_project_project_member_path(@project.namespace, @project, project_member), data: { confirm: remove_from_project_team_message(@project, project_member)}, method: :delete, remote: true, class: "btn btn-sm btn-remove" do %i.fa.fa-times .panel-footer = paginate @project_members, param_name: 'project_members_page', theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/0000755000175600017570000000000012672631600026100 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/_form.html.ham0000644000175600017570000000441712672631600030642 0ustar pravipravi= form_for @appearance, url: admin_appearances_path, html: { class: 'form-horizontal'} do |f| - if @appearance.errors.any? .alert.alert-danger - @appearance.errors.full_messages.each do |msg| %p= msg %fieldset.sign-in %legend Sign in/Sign up pages: .form-group = f.label :title, class: 'control-label' .col-sm-10 = f.text_field :title, class: "form-control" .form-group = f.label :description, class: 'control-label' .col-sm-10 = f.text_area :description, class: "form-control", rows: 10 .hint Description parsed with #{link_to "GitLab Flavored Markdown", help_page_path('markdown', 'markdown'), target: '_blank'}. .form-group = f.label :logo, class: 'control-label' .col-sm-10 - if @appearance.logo? = image_tag @appearance.logo_url, class: 'appearance-logo-preview' - if @appearance.persisted? %br = link_to 'Remove logo', logo_admin_appearances_path, data: { confirm: "Logo will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-logo" %hr = f.hidden_field :logo_cache = f.file_field :logo, class: "" .hint Maximum file size is 1MB. Pages are optimized for a 640x360 px logo. %fieldset.app_logo %legend Navigation bar: .form-group = f.label :header_logo, 'Header logo', class: 'control-label' .col-sm-10 - if @appearance.header_logo? = image_tag @appearance.header_logo_url, class: 'appearance-light-logo-preview' - if @appearance.persisted? %br = link_to 'Remove header logo', header_logos_admin_appearances_path, data: { confirm: "Header logo will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-logo" %hr = f.hidden_field :header_logo_cache = f.file_field :header_logo, class: "" .hint Maximum file size is 1MB. Pages are optimized for a 72x72 px header logo .form-actions = f.submit 'Save', class: 'btn btn-save' - if @appearance.persisted? = link_to 'Preview last save', preview_admin_appearances_path, class: 'btn', target: '_blank' - if @appearance.updated_at %span.pull-right Last edit #{time_ago_with_tooltip(@appearance.updated_at)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/show.html.haml0000644000175600017570000000021312672631600030662 0ustar pravipravi- page_title "Appearance" %h3.page-title Appearance settings %p.light You can modify the look and feel of GitLab here = render 'form' ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/preview.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/appearances/preview.html.h0000644000175600017570000000142312672631600030675 0ustar pravipravi- page_title "Preview | Appearance" %h3.page-title Appearance settings - Preview %hr .ui-box .title Sign-in page %div .login-page .container .content .login-title %h1= brand_title %hr .container .content .row .col-sm-7 .brand-image = brand_image .brand_text = brand_text .col-sm-4 .login-box %h3.page-title Sign in = text_field_tag :login, nil, class: "form-control top", placeholder: "Username or Email" = password_field_tag :password, nil, class: "form-control bottom", placeholder: "Password" = button_tag "Sign in", class: "btn-create btn" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/spam_logs/0000755000175600017570000000000012672631600025602 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/spam_logs/index.html.haml0000644000175600017570000000063412672631600030522 0ustar pravipravi- page_title "Spam Logs" %h3.page-title Spam Logs %hr - if @spam_logs.present? .table-holder %table.table %thead %tr %th Date %th User %th Source IP %th API? %th Type %th Title %th Description %th Primary Action %th = render @spam_logs = paginate @spam_logs - else %h4 There are no Spam Logs ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/spam_logs/_spam_log.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/spam_logs/_spam_log.html.h0000644000175600017570000000201512672631600030654 0ustar pravipravi- user = spam_log.user %tr %td = time_ago_with_tooltip(spam_log.created_at) %td - if user = link_to user.name, [:admin, user] .light.small Joined #{time_ago_with_tooltip(user.created_at)} - else (removed) %td = spam_log.source_ip %td = spam_log.via_api? ? 'Y' : 'N' %td = spam_log.noteable_type %td = spam_log.title %td = truncate(spam_log.description, length: 100) %td - if user = link_to 'Remove user', admin_spam_log_path(spam_log, remove_user: true), data: { confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-xs btn-remove" %td - if user && !user.blocked? = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs" - else .btn.btn-xs.disabled Already Blocked = link_to 'Remove log', [:admin, spam_log], remote: true, method: :delete, class: "btn btn-xs btn-close js-remove-tr" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/keys/0000755000175600017570000000000012672631600024571 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/keys/show.html.haml0000644000175600017570000000012212672631600027352 0ustar pravipravi- page_title @key.title, "Keys" = render "profiles/keys/key_details", admin: true gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/0000755000175600017570000000000012672631600025757 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/edit.html.haml0000644000175600017570000000022112672631600030505 0ustar pravipravi- page_title "Edit", @identity.provider, "Identities", @user.name, "Users" %h3.page-title Edit identity for #{@user.name} %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/new.html.haml0000644000175600017570000000011412672631600030352 0ustar pravipravi- page_title "New Identity" %h3.page-title New identity %hr = render 'form' ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/_identity.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/_identity.html.0000644000175600017570000000065512672631600030721 0ustar pravipravi%tr %td = "#{Gitlab::OAuth::Provider.label_for(identity.provider)} (#{identity.provider})" %td = identity.extern_uid %td = link_to edit_admin_user_identity_path(@user, identity), class: 'btn btn-xs btn-grouped' do Edit = link_to [:admin, @user, identity], method: :delete, class: 'btn btn-xs btn-danger', data: { confirm: "Are you sure you want to remove this identity?" } do Delete gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/index.html.haml0000644000175600017570000000057212672631600030700 0ustar pravipravi- page_title "Identities", @user.name, "Users" = render 'admin/users/head' = link_to 'New Identity', new_admin_user_identity_path, class: 'pull-right btn btn-new' - if @identities.present? .table-holder %table.table %thead %tr %th Provider %th Identifier %th = render @identities - else %h4 This user has no identities gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/identities/_form.html.haml0000644000175600017570000000140312672631600030665 0ustar pravipravi= form_for [:admin, @user, @identity], html: { class: 'form-horizontal fieldset-form' } do |f| - if @identity.errors.any? #error_explanation .alert.alert-danger - @identity.errors.full_messages.each do |msg| %p= msg .form-group = f.label :provider, class: 'control-label' .col-sm-10 - values = Gitlab::OAuth::Provider.providers.map { |name| ["#{Gitlab::OAuth::Provider.label_for(name)} (#{name})", name] } = f.select :provider, values, { allow_blank: false }, class: 'form-control' .form-group = f.label :extern_uid, "Identifier", class: 'control-label' .col-sm-10 = f.text_field :extern_uid, class: 'form-control', required: true .form-actions = f.submit 'Save changes', class: "btn btn-save" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/0000755000175600017570000000000012672631600025060 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/edit.html.haml0000644000175600017570000000013312672631600027610 0ustar pravipravi- page_title "Edit", @label.name, "Labels" %h3.page-title Edit Label %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/new.html.haml0000644000175600017570000000011012672631600027447 0ustar pravipravi- page_title "New Label" %h3.page-title New Label %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/destroy.js.haml0000644000175600017570000000013612672631600030027 0ustar pravipravi- if @labels.size == 0 $('.labels').load(document.URL + ' .light-well').hide().fadeIn(1000) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/index.html.haml0000644000175600017570000000054312672631600027777 0ustar pravipravi- page_title "Labels" = link_to new_admin_label_path, class: "pull-right btn btn-nr btn-new" do New label %h3.page-title Labels %hr .labels - if @labels.present? %ul.bordered-list.manage-labels-list = render @labels = paginate @labels, theme: 'gitlab' - else .light-well .nothing-here-block There are no labels yet gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/_form.html.haml0000644000175600017570000000235612672631600027776 0ustar pravipravi= form_for [:admin, @label], html: { class: 'form-horizontal label-form js-requires-input' } do |f| -if @label.errors.any? .row .col-sm-offset-2.col-sm-10 .alert.alert-danger - @label.errors.full_messages.each do |msg| %span= msg %br .form-group = f.label :title, class: 'control-label' .col-sm-10 = f.text_field :title, class: "form-control", required: true .form-group = f.label :description, class: 'control-label' .col-sm-10 = f.text_field :description, class: "form-control js-quick-submit" .form-group = f.label :color, "Background color", class: 'control-label' .col-sm-10 .input-group .input-group-addon.label-color-preview   = f.color_field :color, class: "form-control" .help-block Choose any color. %br Or you can choose one of suggested colors below .suggest-colors - suggested_colors.each do |color| = link_to '#', style: "background-color: #{color}", data: { color: color } do   .form-actions = f.submit 'Save', class: 'btn btn-save js-save-button' = link_to "Cancel", admin_labels_path, class: 'btn btn-cancel' :javascript new Labels(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/labels/_label.html.haml0000644000175600017570000000061312672631600030104 0ustar pravipravi%li{id: dom_id(label)} .label-row = render_colored_label(label) = markdown(label.description, pipeline: :single_line) .pull-right = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm' = link_to 'Delete', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Delete this label? Are you sure?"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/builds/0000755000175600017570000000000012672631600025100 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/builds/index.html.haml0000644000175600017570000000263012672631600030016 0ustar pravipravi.top-area %ul.nav-links %li{class: ('active' if @scope.nil?)} = link_to admin_builds_path do All %span.badge.js-totalbuilds-count= @all_builds.count(:id) %li{class: ('active' if @scope == 'running')} = link_to admin_builds_path(scope: :running) do Running %span.badge.js-running-count= number_with_delimiter(@all_builds.running_or_pending.count(:id)) %li{class: ('active' if @scope == 'finished')} = link_to admin_builds_path(scope: :finished) do Finished %span.badge.js-running-count= number_with_delimiter(@all_builds.finished.count(:id)) .nav-controls - if @all_builds.running_or_pending.any? = link_to 'Cancel all', cancel_all_admin_builds_path, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post .gray-content-block.second-block #{(@scope || 'running').capitalize} builds %ul.content-list - if @builds.blank? %li .nothing-here-block No builds to show - else .table-holder %table.table.builds %thead %tr %th Status %th Build ID %th Project %th Commit %th Ref %th Runner %th Name %th Duration %th Finished at %th - @builds.each do |build| = render "admin/builds/build", build: build = paginate @builds, theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/builds/_build.html.haml0000644000175600017570000000413512672631600030147 0ustar pravipravi- project = build.project %tr.build %td.status = ci_status_with_icon(build.status) %td.build-link - if can?(current_user, :read_build, project) && build.target_url = link_to build.target_url do %strong Build ##{build.id} - else %strong Build ##{build.id} - if build.show_warning? %i.fa.fa-warning.text-warning %td - if project = link_to project.name_with_namespace, admin_namespace_project_path(project.namespace, project), class: "monospace" %td = link_to build.short_sha, namespace_project_commit_path(project.namespace, project, build.sha), class: "monospace" %td - if build.ref = link_to build.ref, namespace_project_commits_path(project.namespace, project, build.ref) - else .light none %td - if build.try(:runner) = runner_link(build.runner) - else .light none %td #{build.stage} / #{build.name} .pull-right - if build.tags.any? - build.tags.each do |tag| %span.label.label-primary = tag - if build.try(:trigger_request) %span.label.label-info triggered - if build.try(:allow_failure) %span.label.label-danger allowed to fail %td.duration - if build.duration #{duration_in_words(build.finished_at, build.started_at)} %td.timestamp - if build.finished_at %span #{time_ago_with_tooltip(build.finished_at)} - if defined?(coverage) && coverage %td.coverage - if build.try(:coverage) #{build.coverage}% %td .pull-right - if can?(current_user, :read_build, project) && build.artifacts? = link_to build.artifacts_download_url, title: 'Download artifacts' do %i.fa.fa-download - if can?(current_user, :update_build, build.project) - if build.active? - if build.cancel_url = link_to build.cancel_url, method: :post, title: 'Cancel' do %i.fa.fa-remove.cred - elsif defined?(allow_retry) && allow_retry && build.retry_url = link_to build.retry_url, method: :post, title: 'Retry' do %i.fa.fa-repeat gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/abuse_reports/0000755000175600017570000000000012672631600026473 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/abuse_reports/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/abuse_reports/index.html.h0000644000175600017570000000054512672631600030722 0ustar pravipravi- page_title "Abuse Reports" %h3.page-title Abuse Reports %hr - if @abuse_reports.present? .table-holder %table.table %thead %tr %th User %th Reported by %th Message %th Primary action %th = render @abuse_reports = paginate @abuse_reports - else %h4 There are no abuse reports ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/abuse_reports/_abuse_report.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/abuse_reports/_abuse_repor0000644000175600017570000000215212672631600031063 0ustar pravipravi- reporter = abuse_report.reporter - user = abuse_report.user %tr %td - if user = link_to user.name, [:admin, user] .light.small Joined #{time_ago_with_tooltip(user.created_at)} - else (removed) %td - if reporter = link_to reporter.name, [:admin, reporter] - else (removed) .light.small = time_ago_with_tooltip(abuse_report.created_at) %td = markdown(abuse_report.message.squish!, pipeline: :single_line) %td - if user = link_to 'Remove user & report', admin_abuse_report_path(abuse_report, remove_user: true), data: { confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?" }, remote: true, method: :delete, class: "btn btn-xs btn-remove js-remove-tr" %td - if user && !user.blocked? = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs" - else .btn.btn-xs.disabled Already Blocked = link_to 'Remove report', [:admin, abuse_report], remote: true, method: :delete, class: "btn btn-xs btn-close js-remove-tr" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/application_settings/0000755000175600017570000000000012672631600030041 5ustar pravipravi././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/application_settings/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/application_settings/_form0000644000175600017570000003107212672631600031071 0ustar pravipravi= form_for @application_setting, url: admin_application_settings_path, html: { class: 'form-horizontal fieldset-form' } do |f| - if @application_setting.errors.any? #error_explanation .alert.alert-danger - @application_setting.errors.full_messages.each do |msg| %p= msg %fieldset %legend Visibility and Access Controls .form-group = f.label :default_branch_protection, class: 'control-label col-sm-2' .col-sm-10 = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control' .form-group.project-visibility-level-holder = f.label :default_project_visibility, class: 'control-label col-sm-2' .col-sm-10 = render('shared/visibility_radios', model_method: :default_project_visibility, form: f, selected_level: @application_setting.default_project_visibility, form_model: Project.new) .form-group.project-visibility-level-holder = f.label :default_snippet_visibility, class: 'control-label col-sm-2' .col-sm-10 = render('shared/visibility_radios', model_method: :default_snippet_visibility, form: f, selected_level: @application_setting.default_snippet_visibility, form_model: ProjectSnippet.new) .form-group = f.label :restricted_visibility_levels, class: 'control-label col-sm-2' .col-sm-10 - data_attrs = { toggle: 'buttons' } .btn-group{ data: data_attrs } - restricted_level_checkboxes('restricted-visibility-help').each do |level| = level %span.help-block#restricted-visibility-help Selected levels cannot be used by non-admin users for projects or snippets .form-group = f.label :import_sources, class: 'control-label col-sm-2' .col-sm-10 - data_attrs = { toggle: 'buttons' } .btn-group{ data: data_attrs } - import_sources_checkboxes('import-sources-help').each do |source| = source %span.help-block#import-sources-help Enabled sources for code import during project creation. OmniAuth must be configured for GitHub = link_to "(?)", help_page_path("integration", "github") , Bitbucket = link_to "(?)", help_page_path("integration", "bitbucket") and GitLab.com = link_to "(?)", help_page_path("integration", "gitlab") .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :version_check_enabled do = f.check_box :version_check_enabled Version check enabled .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :email_author_in_body do = f.check_box :email_author_in_body Include author name in notification email body .help-block Some email servers do not support overriding the email sender name. Enable this option to include the name of the author of the issue, merge request or comment in the email body instead. .form-group = f.label :admin_notification_email, class: 'control-label col-sm-2' .col-sm-10 = f.text_field :admin_notification_email, class: 'form-control' .help-block Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area. %fieldset %legend Account and Limit Settings .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :gravatar_enabled do = f.check_box :gravatar_enabled Gravatar enabled .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :twitter_sharing_enabled do = f.check_box :twitter_sharing_enabled, :'aria-describedby' => 'twitter_help_block' Twitter enabled %span.help-block#twitter_help_block Show users a button to share their newly created public or internal projects on twitter .form-group = f.label :default_projects_limit, class: 'control-label col-sm-2' .col-sm-10 = f.number_field :default_projects_limit, class: 'form-control' .form-group = f.label :max_attachment_size, 'Maximum attachment size (MB)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :max_attachment_size, class: 'form-control' .form-group = f.label :session_expire_delay, 'Session duration (minutes)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :session_expire_delay, class: 'form-control' %span.help-block#session_expire_delay_help_block GitLab restart is required to apply changes .form-group = f.label :user_oauth_applications, 'User OAuth applications', class: 'control-label col-sm-2' .col-sm-10 .checkbox = f.label :user_oauth_applications do = f.check_box :user_oauth_applications Allow users to register any application to use GitLab as an OAuth provider %fieldset %legend Sign-in Restrictions .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :signup_enabled do = f.check_box :signup_enabled Sign-up enabled .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :signin_enabled do = f.check_box :signin_enabled Sign-in enabled .form-group = f.label :two_factor_authentication, 'Two-factor authentication', class: 'control-label col-sm-2' .col-sm-10 .checkbox = f.label :require_two_factor_authentication do = f.check_box :require_two_factor_authentication Require all users to setup Two-factor authentication .form-group = f.label :two_factor_authentication, 'Two-factor grace period (hours)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :two_factor_grace_period, min: 0, class: 'form-control', placeholder: '0' .help-block Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication .form-group = f.label :restricted_signup_domains, 'Restricted domains for sign-ups', class: 'control-label col-sm-2' .col-sm-10 = f.text_area :restricted_signup_domains_raw, placeholder: 'domain.com', class: 'form-control' .help-block Only users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com .form-group = f.label :home_page_url, 'Home page URL', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block' %span.help-block#home_help_block We will redirect non-logged in users to this page .form-group = f.label :after_sign_out_path, class: 'control-label col-sm-2' .col-sm-10 = f.text_field :after_sign_out_path, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'after_sign_out_path_help_block' %span.help-block#after_sign_out_path_help_block We will redirect users to this page after they sign out .form-group = f.label :sign_in_text, class: 'control-label col-sm-2' .col-sm-10 = f.text_area :sign_in_text, class: 'form-control', rows: 4 .help-block Markdown enabled .form-group = f.label :help_page_text, class: 'control-label col-sm-2' .col-sm-10 = f.text_area :help_page_text, class: 'form-control', rows: 4 .help-block Markdown enabled %fieldset %legend Continuous Integration .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :shared_runners_enabled do = f.check_box :shared_runners_enabled Enable shared runners for new projects .form-group = f.label :max_artifacts_size, 'Maximum artifacts size (MB)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :max_artifacts_size, class: 'form-control' %fieldset %legend Metrics %p These settings require a restart to take effect. .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :metrics_enabled do = f.check_box :metrics_enabled Enable InfluxDB Metrics .form-group = f.label :metrics_host, 'InfluxDB host', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :metrics_host, class: 'form-control', placeholder: 'influxdb.example.com' .form-group = f.label :metrics_port, 'InfluxDB port', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :metrics_port, class: 'form-control', placeholder: '8089' .help-block The UDP port to use for connecting to InfluxDB. InfluxDB requires that your server configuration specifies a database to store data in when sending messages to this port, without it metrics data will not be saved. .form-group = f.label :metrics_pool_size, 'Connection pool size', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :metrics_pool_size, class: 'form-control' .help-block The amount of InfluxDB connections to open. Connections are opened lazily. Users using multi-threaded application servers should ensure enough connections are available (at minimum the amount of application server threads). .form-group = f.label :metrics_timeout, 'Connection timeout', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :metrics_timeout, class: 'form-control' .help-block The amount of seconds after which an InfluxDB connection will time out. .form-group = f.label :metrics_method_call_threshold, 'Method Call Threshold (ms)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :metrics_method_call_threshold, class: 'form-control' .help-block A method call is only tracked when it takes longer to complete than the given amount of milliseconds. .form-group = f.label :metrics_sample_interval, 'Sampler Interval (sec)', class: 'control-label col-sm-2' .col-sm-10 = f.number_field :metrics_sample_interval, class: 'form-control' .help-block The sampling interval in seconds. Sampled data includes memory usage, retained Ruby objects, file descriptors and so on. %fieldset %legend Spam and Anti-bot Protection .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :recaptcha_enabled do = f.check_box :recaptcha_enabled Enable reCAPTCHA %span.help-block#recaptcha_help_block Helps prevent bots from creating accounts .form-group = f.label :recaptcha_site_key, 'reCAPTCHA Site Key', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :recaptcha_site_key, class: 'form-control' .help-block Generate site and private keys at %a{ href: 'http://www.google.com/recaptcha', target: 'blank'} http://www.google.com/recaptcha .form-group = f.label :recaptcha_private_key, 'reCAPTCHA Private Key', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :recaptcha_private_key, class: 'form-control' .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :akismet_enabled do = f.check_box :akismet_enabled Enable Akismet %span.help-block#akismet_help_block Helps prevent bots from creating issues .form-group = f.label :akismet_api_key, 'Akismet API Key', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :akismet_api_key, class: 'form-control' .help-block Generate API key at %a{ href: 'http://www.akismet.com', target: 'blank'} http://www.akismet.com %fieldset %legend Error Reporting and Logging %p These settings require a restart to take effect. .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :sentry_enabled do = f.check_box :sentry_enabled Enable Sentry .help-block Sentry is an error reporting and logging tool which is currently not shipped with GitLab, get it here: %a{ href: 'https://getsentry.com', target: '_blank' } https://getsentry.com .form-group = f.label :sentry_dsn, 'Sentry DSN', class: 'control-label col-sm-2' .col-sm-10 = f.text_field :sentry_dsn, class: 'form-control' .form-actions = f.submit 'Save', class: 'btn btn-save' ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/application_settings/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/admin/application_settings/show.0000644000175600017570000000010412672631600031015 0ustar pravipravi- page_title "Settings" %h3.page-title Settings %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/0000755000175600017570000000000012672631600024340 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/file_samples/0000755000175600017570000000000012672631600027003 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/file_samples/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/file_samples/show.html.0000644000175600017570000000305212672631600030727 0ustar pravipravi- page_title t('sherlock.title'), t('sherlock.transaction'), t('sherlock.file_sample') - header_title t('sherlock.title'), sherlock_transactions_path .gray-content-block .pull-right = link_to(sherlock_transaction_path(@transaction), class: 'btn') do %i.fa.fa-arrow-left = t('sherlock.transaction') .oneline = t('sherlock.file_sample') = @file_sample.id .prepend-top-default %p %span.light #{t('sherlock.time')}: %strong = @file_sample.duration.round(2) = t('sherlock.milliseconds') %p %span.light #{t('sherlock.events')}: %strong = @file_sample.events %article.file-holder .file-title %i.fa.fa-file-text-o.fa-fw %strong = @file_sample.file .code.file-content.js-syntax-highlight .line-numbers %table.sherlock-line-samples-table %thead %tr %th= t('sherlock.line_capitalized') %th= t('sherlock.events') %th= t('sherlock.time') %th= t('sherlock.percent') %tbody - @file_sample.line_samples.each_with_index do |sample, index| %tr{class: sample.majority_of?(@file_sample.duration) ? 'slow' : ''} %td= index + 1 %td= sample.events %td = sample.duration.round(2) = t('sherlock.milliseconds') %td = sample.percentage_of(@file_sample.duration).round = t('sherlock.percent') .sherlock-file-sample = highlight(@file_sample.file, @file_sample.source) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/0000755000175600017570000000000012672631600026015 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/_general.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/_general.html.h0000644000175600017570000000254412672631600030712 0ustar pravipravi.prepend-top-default .panel.panel-default .panel-heading %strong = t('sherlock.general') %ul.well-list %li %span.light #{t('sherlock.time')}: %strong = @query.duration.round(4) = t('sherlock.milliseconds') %li %span.light #{t('sherlock.origin')}: %strong = @query.last_application_frame.path %small.light = t('sherlock.line') = @query.last_application_frame.line .panel.panel-default .panel-heading .pull-right %button.js-clipboard-trigger.btn.btn-xs{title: t('sherlock.copy_to_clipboard'), type: :button} %i.fa.fa-clipboard %pre.hidden = @query.formatted_query %strong = t('sherlock.query') %ul.well-list %li .code.js-syntax-highlight.sherlock-code :preserve #{highlight("#{@query.id}.sql", @query.formatted_query)} .panel.panel-default .panel-heading .pull-right %button.js-clipboard-trigger.btn.btn-xs{title: t('sherlock.copy_to_clipboard'), type: :button} %i.fa.fa-clipboard %pre.hidden = @query.explain %strong = t('sherlock.query_plan') %ul.well-list %li .code.js-syntax-highlight.sherlock-code %pre %code= @query.explain gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/show.html.haml0000644000175600017570000000126612672631600030610 0ustar pravipravi- page_title t('sherlock.title'), t('sherlock.transaction'), t('sherlock.query') - header_title t('sherlock.title'), sherlock_transactions_path %ul.nav-links %li.active %a(href="#tab-general" data-toggle="tab") = t('sherlock.general') %li %a(href="#tab-backtrace" data-toggle="tab") = t('sherlock.backtrace') .gray-content-block .pull-right = link_to(sherlock_transaction_path(@transaction), class: 'btn') do %i.fa.fa-arrow-left = t('sherlock.transaction') .oneline = t('sherlock.query') = @query.id .tab-content .tab-pane.active#tab-general = render(partial: 'general') .tab-pane#tab-backtrace = render(partial: 'backtrace') ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/_backtrace.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/queries/_backtrace.html0000644000175600017570000000126212672631600030762 0ustar pravipravi.prepend-top-default .panel.panel-default .panel-heading %strong = t('sherlock.application_backtrace') %ul.well-list - @query.application_backtrace.each do |location| %li = location.path %small.light = t('sherlock.line') = location.line .panel.panel-default .panel-heading %strong = t('sherlock.full_backtrace') %ul.well-list - @query.backtrace.each do |location| %li - if location.application? %strong= location.path - else = location.path %small.light = t('sherlock.line') = location.line gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/0000755000175600017570000000000012672631600027050 5ustar pravipravi././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_file_samples.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_file_samp0000644000175600017570000000135712672631600031077 0ustar pravipravi- if @transaction.file_samples.empty? .nothing-here-block = t('sherlock.no_file_samples') - else .table-holder %table.table %thead %tr %th= t('sherlock.time_inclusive') %th= t('sherlock.count') %th= t('sherlock.path') %th %tbody - @transaction.sorted_file_samples.each do |sample| %tr %td = sample.duration.round(2) = t('sherlock.milliseconds') %td= @transaction.view_counts.fetch(sample.file, 1) %td= sample.relative_path %td = link_to(t('sherlock.view'), sherlock_transaction_file_sample_path(@transaction, sample), class: 'btn btn-xs') ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/index.html0000644000175600017570000000235212672631600031047 0ustar pravipravi- page_title t('sherlock.title') - header_title t('sherlock.title'), sherlock_transactions_path .gray-content-block .pull-right = link_to(destroy_all_sherlock_transactions_path, class: 'btn btn-danger', method: :delete) do %i.fa.fa-trash = t('sherlock.delete_all_transactions') .oneline= t('sherlock.introduction') - if @transactions.empty? .nothing-here-block= t('sherlock.no_transactions') - else .table-holder %table.table %thead %tr %th= t('sherlock.type') %th= t('sherlock.path') %th= t('sherlock.time') %th= t('sherlock.queries') %th= t('sherlock.finished_at') %th %tbody - @transactions.each do |trans| %tr %td= trans.type %td %span{title: trans.path} = truncate(trans.path, length: 70) %td = trans.duration.round(2) = t('sherlock.seconds') %td= trans.queries.length %td = time_ago_in_words(trans.finished_at) = t('sherlock.ago') %td = link_to(sherlock_transaction_path(trans), class: 'btn btn-xs') do = t('sherlock.view') ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_queries.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_queries.h0000644000175600017570000000134212672631600031035 0ustar pravipravi- if @transaction.queries.empty? .nothing-here-block = t('sherlock.no_queries') - else .table-holder %table.table#sherlock-queries %thead %tr %th= t('sherlock.time') %th= t('sherlock.query') %th %tbody - @transaction.sorted_queries.each do |query| %tr %td = query.duration.round(2) = t('sherlock.milliseconds') %td .code.js-syntax-highlight.sherlock-code = highlight("#{query.id}.sql", query.formatted_query) %td = link_to(t('sherlock.view'), sherlock_transaction_query_path(@transaction, query), class: 'btn btn-xs') ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_general.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/_general.h0000644000175600017570000000166112672631600031001 0ustar pravipravi.prepend-top-default .panel.panel-default .panel-heading %strong = t('sherlock.general') %ul.well-list %li %span.light #{t('sherlock.id')}: %strong = @transaction.id %li %span.light #{t('sherlock.type')}: %strong = @transaction.type %li %span.light #{t('sherlock.path')}: %strong = @transaction.path %li %span.light #{t('sherlock.time')}: %strong = @transaction.duration.round(2) = t('sherlock.seconds') %li %span.light #{t('sherlock.query_time')} %strong = @transaction.query_duration.round(2) = t('sherlock.seconds') %li %span.light #{t('sherlock.finished_at')}: %strong = time_ago_in_words(@transaction.finished_at) = t('sherlock.ago') ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/sherlock/transactions/show.html.0000644000175600017570000000166412672631600031003 0ustar pravipravi- page_title t('sherlock.title'), t('sherlock.transaction') - header_title t('sherlock.title'), sherlock_transactions_path %ul.nav-links %li.active %a(href="#tab-general" data-toggle="tab") = t('sherlock.general') %li %a(href="#tab-queries" data-toggle="tab") = t('sherlock.queries') %span.badge #{@transaction.queries.length} %li %a(href="#tab-file-samples" data-toggle="tab") = t('sherlock.file_samples') %span.badge #{@transaction.file_samples.length} .gray-content-block .pull-right = link_to(sherlock_transactions_path, class: 'btn') do %i.fa.fa-arrow-left = t('sherlock.all_transactions') .oneline = t('sherlock.transaction') = @transaction.id .tab-content .tab-pane.active#tab-general = render(partial: 'general') .tab-pane#tab-queries = render(partial: 'queries') .tab-pane#tab-file-samples = render(partial: 'file_samples') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/0000755000175600017570000000000012672631600023774 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_project_limit.html.haml0000644000175600017570000000102112672631600030577 0ustar pravipravi- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0 .project-limit-message.alert.alert-warning.hidden-xs You won't be able to create new projects because you have reached your project limit. .pull-right = link_to "Don't show again", profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link' | = link_to 'Remind later', '#', class: 'hide-project-limit-message alert-link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_issues.html.haml0000644000175600017570000000120012672631600027245 0ustar pravipravi- if @issues.any? - @issues.group_by(&:project).each do |group| .panel.panel-default.panel-small - project = group[0] .panel-heading = link_to project.name_with_namespace, namespace_project_issues_path(project.namespace, project) - if can?(current_user, :create_issue, project) .pull-right = link_to 'New issue', new_namespace_project_issue_path(project.namespace, project) %ul.well-list.issues-list - group[1].each do |issue| = render 'projects/issues/issue', issue: issue = paginate @issues, theme: "gitlab" - else .nothing-here-block No issues to show ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_visibility_level.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_visibility_level.html.ha0000644000175600017570000000117212672631600030767 0ustar pravipravi.form-group.project-visibility-level-holder = f.label :visibility_level, class: 'control-label' do Visibility Level = link_to "(?)", help_page_path("public_access", "public_access") .col-sm-10 - if can_change_visibility_level = render('shared/visibility_radios', model_method: :visibility_level, form: f, selected_level: visibility_level, form_model: form_model) - else .col-sm-10 %span.info = visibility_level_icon(visibility_level) %strong = visibility_level_label(visibility_level) .light= visibility_level_description(visibility_level, form_model) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/0000755000175600017570000000000012672631600025603 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_sidebar.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_sidebar.html.ha0000644000175600017570000001321112672631600030626 0ustar pravipravi%aside.right-sidebar{ class: sidebar_gutter_collapsed_class } .issuable-sidebar .block %span.issuable-count.hide-collapsed.pull-left = issuable.iid of = issuables_count(issuable) %span.pull-right %a.gutter-toggle{href: '#'} = sidebar_gutter_toggle_icon .issuable-nav.hide-collapsed.pull-right.btn-group{role: 'group', "aria-label" => '...'} - if prev_issuable = prev_issuable_for(issuable) = link_to 'Prev', [@project.namespace.becomes(Namespace), @project, prev_issuable], class: 'btn btn-default prev-btn' - else %a.btn.btn-default.disabled{href: '#'} Prev - if next_issuable = next_issuable_for(issuable) = link_to 'Next', [@project.namespace.becomes(Namespace), @project, next_issuable], class: 'btn btn-default next-btn' - else %a.btn.btn-default.disabled{href: '#'} Next = form_for [@project.namespace.becomes(Namespace), @project, issuable], remote: true, html: {class: 'issuable-context-form inline-update js-issuable-update'} do |f| .block.assignee .sidebar-collapsed-icon - if issuable.assignee = link_to_member_avatar(issuable.assignee, size: 24) - else = icon('user') .title.hide-collapsed %label Assignee - if can?(current_user, :"admin_#{issuable.to_ability_name}", @project) .pull-right = link_to 'Edit', '#', class: 'edit-link' .value.hide-collapsed - if issuable.assignee %strong= link_to_member(@project, issuable.assignee, size: 24) - if issuable.instance_of?(MergeRequest) && !issuable.can_be_merged_by?(issuable.assignee) %a.pull-right.cannot-be-merged{href: '#', data: {toggle: 'tooltip'}, title: 'Not allowed to merge'} = icon('exclamation-triangle') - else .light None .selectbox.hide-collapsed = users_select_tag("#{issuable.class.table_name.singularize}[assignee_id]", placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: issuable.assignee_id, project: @target_project, null_user: true, current_user: true, first_user: true) .block.milestone .sidebar-collapsed-icon = icon('clock-o') %span - if issuable.milestone = issuable.milestone.title - else No .title.hide-collapsed %label Milestone - if can?(current_user, :"admin_#{issuable.to_ability_name}", @project) .pull-right = link_to 'Edit', '#', class: 'edit-link' .value.hide-collapsed - if issuable.milestone %span.back-to-milestone = link_to namespace_project_milestone_path(@project.namespace, @project, issuable.milestone) do %strong = icon('clock-o') = issuable.milestone.title - else .light None .selectbox.hide-collapsed = f.select(:milestone_id, milestone_options(issuable), { include_blank: true }, { class: 'select2 select2-compact js-select2 js-milestone', data: { placeholder: 'Select milestone' }}) = hidden_field_tag :issuable_context = f.submit class: 'btn hide' - if issuable.project.labels.any? .block.labels .sidebar-collapsed-icon = icon('tags') %span = issuable.labels.count .title.hide-collapsed %label Labels - if can?(current_user, :"admin_#{issuable.to_ability_name}", @project) .pull-right = link_to 'Edit', '#', class: 'edit-link' .value.issuable-show-labels.hide-collapsed - if issuable.labels.any? - issuable.labels.each do |label| = link_to_label(label, type: issuable.to_ability_name) - else .light None .selectbox.hide-collapsed = f.collection_select :label_ids, issuable.project.labels.all, :id, :name, { selected: issuable.label_ids }, multiple: true, class: 'select2 js-select2', data: { placeholder: "Select labels" } = render "shared/issuable/participants", participants: issuable.participants(current_user) %hr - if current_user - subscribed = issuable.subscribed?(current_user) .block.light .sidebar-collapsed-icon = icon('rss') .title.hide-collapsed %label.light Notifications - subscribtion_status = subscribed ? 'subscribed' : 'unsubscribed' %button.btn.btn-block.btn-gray.subscribe-button.hide-collapsed{:type => 'button'} %span= subscribed ? 'Unsubscribe' : 'Subscribe' .subscription-status.hide-collapsed{data: {status: subscribtion_status}} .unsubscribed{class: ( 'hidden' if subscribed )} You're not receiving notifications from this thread. .subscribed{class: ( 'hidden' unless subscribed )} You're receiving notifications because you're subscribed to this thread. - project_ref = cross_project_reference(@project, issuable) .block.project-reference .sidebar-collapsed-icon = clipboard_button(clipboard_text: project_ref) .cross-project-reference.hide-collapsed %span Reference: %cite{title: project_ref} = project_ref = clipboard_button(clipboard_text: project_ref) :javascript new Subscription("#{toggle_subscription_path(issuable)}"); new IssuableContext(); ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_participants.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_participants.ht0000644000175600017570000000046612672631600031006 0ustar pravipravi.block.participants .sidebar-collapsed-icon = icon('users') %span = participants.count .title.hide-collapsed = pluralize participants.count, "participant" - participants.each do |participant| %span.hide-collapsed = link_to_member(@project, participant, name: false, size: 24) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_form.html.haml0000644000175600017570000001117712672631600030522 0ustar pravipravi- if issuable.errors.any? .row .col-sm-offset-2.col-sm-10 .alert.alert-danger - issuable.errors.full_messages.each do |msg| %span= msg %br .form-group = f.label :title, class: 'control-label' .col-sm-10 = f.text_field :title, maxlength: 255, autofocus: true, autocomplete: 'off', class: 'form-control pad js-gfm-input js-quick-submit', required: true - if issuable.is_a?(MergeRequest) %p.help-block - if issuable.work_in_progress? Remove the WIP prefix from the title to allow this Work In Progress merge request to be merged when it's ready. - else Start the title with [WIP] or WIP: to prevent a Work In Progress merge request from being merged before it's ready. .form-group.detail-page-description = f.label :description, 'Description', class: 'control-label' .col-sm-10 = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control js-quick-submit' = render 'projects/notes/hints' .clearfix .error-alert - if can?(current_user, :"admin_#{issuable.to_ability_name}", issuable.project) %hr .form-group .issue-assignee = f.label :assignee_id, "Assignee", class: 'control-label' .col-sm-10 = users_select_tag("#{issuable.class.model_name.param_key}[assignee_id]", placeholder: 'Select assignee', class: 'custom-form-control', null_user: true, selected: issuable.assignee_id, project: @target_project || @project, first_user: true, current_user: true, include_blank: true)   = link_to 'Assign to me', '#', class: 'btn assign-to-me-link' .form-group .issue-milestone = f.label :milestone_id, "Milestone", class: 'control-label' .col-sm-10 - if milestone_options(issuable).present? = f.select(:milestone_id, milestone_options(issuable), { include_blank: true }, { class: 'select2', data: { placeholder: 'Select milestone' } }) - else .prepend-top-10 %span.light No open milestones available.   - if can? current_user, :admin_milestone, issuable.project = link_to 'Create new milestone', new_namespace_project_milestone_path(issuable.project.namespace, issuable.project), target: :blank .form-group = f.label :label_ids, "Labels", class: 'control-label' .col-sm-10 - if issuable.project.labels.any? = f.collection_select :label_ids, issuable.project.labels.all, :id, :name, { selected: issuable.label_ids }, multiple: true, class: 'select2', data: { placeholder: "Select labels" } - else .prepend-top-10 %span.light No labels yet.   - if can? current_user, :admin_label, issuable.project = link_to 'Create new label', new_namespace_project_label_path(issuable.project.namespace, issuable.project), target: :blank - if issuable.is_a?(MergeRequest) %hr - if @merge_request.new_record? .form-group = f.label :source_branch, class: 'control-label' .col-sm-10 = f.select(:source_branch, [@merge_request.source_branch], { }, { class: 'source_branch select2 span2', disabled: true }) .form-group = f.label :target_branch, class: 'control-label' .col-sm-10 = f.select(:target_branch, @merge_request.target_branches, { include_blank: true }, { class: 'target_branch select2 span2', disabled: @merge_request.new_record?, data: {placeholder: "Select branch"} }) - if @merge_request.new_record? %p.help-block = link_to 'Change branches', mr_change_branches_path(@merge_request) - is_footer = !(issuable.is_a?(MergeRequest) && issuable.new_record?) .gray-content-block{class: (is_footer ? "footer-block" : "middle-block")} - if issuable.new_record? = f.submit "Submit #{issuable.class.model_name.human.downcase}", class: 'btn btn-create' - else = f.submit 'Save changes', class: 'btn btn-save' - if !issuable.persisted? && !issuable.project.empty_repo? && (guide_url = contribution_guide_path(issuable.project)) .inline.prepend-left-10 Please review the %strong #{link_to 'contribution guidelines', guide_url} for this project. - if issuable.new_record? - cancel_project = issuable.source_project - else - cancel_project = issuable.project = link_to 'Cancel', [cancel_project.namespace.becomes(Namespace), cancel_project, issuable], class: 'btn btn-cancel' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_nav.html.haml0000644000175600017570000000245612672631600030343 0ustar pravipravi%ul.nav-links.issues-state-filters - if defined?(type) && type == :merge_requests - page_context_word = 'merge requests' - else - page_context_word = 'issues' %li{class: ("active" if params[:state] == 'opened')} = link_to page_filter_path(state: 'opened'), title: "Filter by #{page_context_word} that are currently opened." do #{state_filters_text_for(:opened, @project)} - if defined?(type) && type == :merge_requests %li{class: ("active" if params[:state] == 'merged')} = link_to page_filter_path(state: 'merged'), title: 'Filter by merge requests that are currently merged.' do #{state_filters_text_for(:merged, @project)} %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed'), title: 'Filter by merge requests that are currently closed and unmerged.' do #{state_filters_text_for(:closed, @project)} - else %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed'), title: 'Filter by issues that are currently closed.' do #{state_filters_text_for(:closed, @project)} %li{class: ("active" if params[:state] == 'all')} = link_to page_filter_path(state: 'all'), title: "Show all #{page_context_word}." do #{state_filters_text_for(:all, @project)} ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_search_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_search_form.htm0000644000175600017570000000110312672631600030737 0ustar pravipravi= form_tag(path, method: :get, id: "issue_search_form", class: 'issue-search-form') do = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by name ...', class: 'form-control issue_search search-text-input input-short', spellcheck: false } = hidden_field_tag :state, params['state'] = hidden_field_tag :scope, params['scope'] = hidden_field_tag :assignee_id, params['assignee_id'] = hidden_field_tag :author_id, params['author_id'] = hidden_field_tag :milestone_id, params['milestone_id'] = hidden_field_tag :label_id, params['label_id'] ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_filter.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/issuable/_filter.html.ham0000644000175600017570000000515412672631600030666 0ustar pravipravi.issues-filters .issues-details-filters.gray-content-block.second-block = form_tag page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name]), method: :get, class: 'filter-form' do - if controller.controller_name == 'issues' && can?(current_user, :admin_issue, @project) .check-all-holder = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left" .issues-other-filters .filter-item.inline = users_select_tag(:author_id, selected: params[:author_id], placeholder: 'Author', class: 'trigger-submit', any_user: "Any Author", first_user: true, current_user: true) .filter-item.inline = users_select_tag(:assignee_id, selected: params[:assignee_id], placeholder: 'Assignee', class: 'trigger-submit', any_user: "Any Assignee", null_user: true, first_user: true, current_user: true) .filter-item.inline.milestone-filter = select_tag('milestone_title', projects_milestones_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Milestone'}) .filter-item.inline.labels-filter = select_tag('label_name', projects_labels_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Label'}) .pull-right = render 'shared/sort_dropdown' - if controller.controller_name == 'issues' .issues_bulk_update.hide = form_tag bulk_update_namespace_project_issues_path(@project.namespace, @project), method: :post do .filter-item.inline = select_tag('update[state_event]', options_for_select([['Open', 'reopen'], ['Closed', 'close']]), include_blank: true, data: { placeholder: "Status" }) .filter-item.inline = users_select_tag('update[assignee_id]', placeholder: 'Assignee', null_user: true, first_user: true, current_user: true) .filter-item.inline = select_tag('update[milestone_id]', bulk_update_milestone_options, include_blank: true, data: { placeholder: "Milestone" }) = hidden_field_tag 'update[issues_ids]', [] = hidden_field_tag :state_event, params[:state_event] .filter-item.inline = button_tag "Update issues", class: "btn update_selected_issues btn-save" - if @label .gray-content-block.second-block = render "shared/label_row", label: @label :javascript new UsersSelect(); $('form.filter-form').on('submit', function (event) { event.preventDefault(); Turbolinks.visit(this.action + '&' + $(this).serialize()); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_import_form.html.haml0000644000175600017570000000161012672631600030274 0ustar pravipravi.form-group.import-url-data = f.label :import_url, class: 'control-label' do %span Git repository URL .col-sm-10 = f.text_field :import_url, class: 'form-control', placeholder: 'https://username:password@gitlab.company.com/group/project.git' .well.prepend-top-20 %ul %li The repository must be accessible over http://, https:// or git://. %li If your HTTP repository is not publicly accessible, add authentication information to the URL: https://username:password@gitlab.company.com/group/project.git. %li The import will time out after 15 minutes. For repositories that take longer, use a clone/push combination. %li To migrate an SVN repository, check out #{link_to "this document", "http://doc.gitlab.com/ce/workflow/importing/migrating_from_svn.html"}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_group_form.html.haml0000644000175600017570000000204012672631600030114 0ustar pravipravi- if @group.persisted? .form-group = f.label :name, class: 'control-label' do Group name .col-sm-10 = f.text_field :name, placeholder: 'open-source', class: 'form-control' .form-group = f.label :path, class: 'control-label' do Group path .col-sm-10 .input-group .input-group-addon = root_url = f.text_field :path, placeholder: 'open-source', class: 'form-control', autofocus: local_assigns[:autofocus] || false - if @group.persisted? .alert.alert-warning.prepend-top-10 %ul %li Changing group path can have unintended side effects. %li Renaming group path will rename directory for all related projects %li It will change web url for access group and group projects. %li It will change the git path to repositories under this group. .form-group.group-description-holder = f.label :description, class: 'control-label' .col-sm-10 = f.text_area :description, maxlength: 250, class: 'form-control js-gfm-input', rows: 4 gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_ref_switcher.html.haml0000644000175600017570000000062612672631600030431 0ustar pravipravi= form_tag switch_namespace_project_refs_path(@project.namespace, @project), method: :get, class: "project-refs-form" do = select_tag "ref", grouped_options_refs, class: "project-refs-select select2 select2-sm" = hidden_field_tag :destination, destination - if defined?(path) = hidden_field_tag :path, path - @options && @options.each do |key, value| = hidden_field_tag key, value, id: nil ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_commit_message_container.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_commit_message_container0000644000175600017570000000122212672631600031111 0ustar pravipravi.form-group.commit_message-group - nonce = SecureRandom.hex = label_tag "commit_message-#{nonce}", class: 'control-label' do Commit message .col-sm-10 .commit-message-container .max-width-marker = text_area_tag 'commit_message', (params[:commit_message] || local_assigns[:text]), class: 'form-control js-commit-message js-quick-submit', placeholder: local_assigns[:placeholder], required: true, rows: (local_assigns[:rows] || 3), id: "commit_message-#{nonce}" - if local_assigns[:hint] %p.hint Try to keep the first line under 52 characters and the others under 72. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_file_highlight.html.haml0000644000175600017570000000102512672631600030705 0ustar pravipravi.file-content.code.js-syntax-highlight .line-numbers - if blob.data.present? - blob.data.each_line.each_with_index do |_, index| - offset = defined?(first_line_number) ? first_line_number : 1 - i = index + offset -# We're not using `link_to` because it is too slow once we get to thousands of lines. %a.diff-line-num{href: "#L#{i}", id: "L#{i}", 'data-line-number' => i} %i.fa.fa-link = i .blob-content{data: {blob_id: blob.id}} = highlight(blob.name, blob.data) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_label_row.html.haml0000644000175600017570000000017312672631600027710 0ustar pravipravi%span.label-row = link_to_label(label) %span.prepend-left-10 = markdown(label.description, pipeline: :single_line) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_visibility_radios.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_visibility_radios.html.h0000644000175600017570000000120412672631600030774 0ustar pravipravi- Gitlab::VisibilityLevel.values.each do |level| - next if skip_level?(form_model, level) .radio - restricted = restricted_visibility_levels.include?(level) = form.label "#{model_method}_#{level}" do = form.radio_button model_method, level, checked: (selected_level == level), disabled: restricted = visibility_level_icon(level) .option-title = visibility_level_label(level) .option-descr = visibility_level_description(level, form_model) - unless restricted_visibility_levels.empty? .col-sm-10 %span.info Some visibility level settings have been restricted by the administrator. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_promo.html.haml0000644000175600017570000000037512672631600027102 0ustar pravipravi.gitlab-promo = link_to 'Homepage', promo_url = link_to 'Blog', promo_url + '/blog/' = link_to '@gitlab', 'https://twitter.com/gitlab' = link_to 'Requests', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#feature-proposals' ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_service_settings.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_service_settings.html.ha0000644000175600017570000000563312672631600030777 0ustar pravipravi- if @service.errors.any? #error_explanation .alert.alert-danger %ul - @service.errors.full_messages.each do |msg| %li= msg - if @service.help.present? .well = preserve do = markdown @service.help .form-group = form.label :active, "Active", class: "control-label" .col-sm-10 = form.check_box :active - if @service.supported_events.length > 1 .form-group = form.label :url, "Trigger", class: 'control-label' .col-sm-10 - if @service.supported_events.include?("push") %div = form.check_box :push_events, class: 'pull-left' .prepend-left-20 = form.label :push_events, class: 'list-label' do %strong Push events %p.light This url will be triggered by a push to the repository - if @service.supported_events.include?("tag_push") %div = form.check_box :tag_push_events, class: 'pull-left' .prepend-left-20 = form.label :tag_push_events, class: 'list-label' do %strong Tag push events %p.light This url will be triggered when a new tag is pushed to the repository - if @service.supported_events.include?("note") %div = form.check_box :note_events, class: 'pull-left' .prepend-left-20 = form.label :note_events, class: 'list-label' do %strong Comments %p.light This url will be triggered when someone adds a comment - if @service.supported_events.include?("issue") %div = form.check_box :issues_events, class: 'pull-left' .prepend-left-20 = form.label :issues_events, class: 'list-label' do %strong Issues events %p.light This url will be triggered when an issue is created/updated/merged - if @service.supported_events.include?("merge_request") %div = form.check_box :merge_requests_events, class: 'pull-left' .prepend-left-20 = form.label :merge_requests_events, class: 'list-label' do %strong Merge Request events %p.light This url will be triggered when a merge request is created/updated/merged - if @service.supported_events.include?("build") %div = form.check_box :build_events, class: 'pull-left' .prepend-left-20 = form.label :build_events, class: 'list-label' do %strong Build events %p.light This url will be triggered when a build status changes - @service.fields.each do |field| - type = field[:type] - if type == 'fieldset' - fields = field[:fields] - legend = field[:legend] %fieldset %legend= legend - fields.each do |subfield| = render 'shared/field', form: form, field: subfield - else = render 'shared/field', form: form, field: field gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_clone_panel.html.haml0000644000175600017570000000161312672631600030221 0ustar pravipravi- project = project || @project .git-clone-holder.input-group .input-group-btn %a#clone-dropdown.clone-dropdown-btn.btn{href: '#', 'data-toggle' => 'dropdown'} %span = default_clone_protocol.upcase = icon('angle-down') %ul.dropdown-menu.dropdown-menu-right.clone-options-dropdown %li %a#ssh-selector{href: @project.ssh_url_to_repo} SSH %li %a#http-selector{href: @project.http_url_to_repo} HTTPS = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true .input-group-btn = clipboard_button(clipboard_target: '#project_clone') :javascript $('ul.clone-options-dropdown a').on('click',function(e){ e.preventDefault(); var $this = $(this); $('a.clone-dropdown-btn span').text($this.text()); $('#project_clone').val($this.attr('href')); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/groups/0000755000175600017570000000000012672631600025313 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/groups/_group.html.haml0000644000175600017570000000210012672631600030405 0ustar pravipravi- group_member = local_assigns[:group_member] - css_class = '' unless local_assigns[:css_class] - css_class += " no-description" if group.description.blank? %li.group-row{ class: css_class } - if group_member .controls.hidden-xs - if can?(current_user, :admin_group, group) = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do %i.fa.fa-cogs = link_to leave_group_group_members_path(group), data: { confirm: leave_group_message(group.name) }, method: :delete, class: "btn-sm btn btn-grouped", title: 'Leave this group' do %i.fa.fa-sign-out .stats %span = icon('home') = number_with_delimiter(group.projects.count) %span = icon('users') = number_with_delimiter(group.users.count) = image_tag group_icon(group), class: "avatar s40 hidden-xs" = link_to group, class: 'group-name' do %span.item-title= group.name - if group_member as %span #{group_member.human_access} - if group.description.present? .light = markdown(group.description, pipeline: :description) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_milestones_filter.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_milestones_filter.html.h0000644000175600017570000000062312672631600030777 0ustar pravipravi%ul.nav-links %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do Open %li{class: ("active" if params[:state] == 'closed')} = link_to milestones_filter_path(state: 'closed') do Closed %li{class: ("active" if params[:state] == 'all')} = link_to milestones_filter_path(state: 'all') do All gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_no_ssh.html.haml0000644000175600017570000000102512672631600027230 0ustar pravipravi- if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key? .no-ssh-key-message.alert.alert-warning.hidden-xs You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path, class: 'alert-link'} to your profile .pull-right = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link' | = link_to 'Remind later', '#', class: 'hide-no-ssh-message alert-link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_group_tips.html.haml0000644000175600017570000000043212672631600030133 0ustar pravipravi%ul %li A group is a collection of several projects %li Groups are private by default %li Members of a group may only view projects they have permission to access %li Group project URLs are prefixed with the group namespace %li Existing projects may be moved into a group gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_event_filter.html.haml0000644000175600017570000000036012672631600030426 0ustar pravipravi%ul.nav-links.event-filter = event_filter_link EventFilter.push, 'Push events' = event_filter_link EventFilter.merged, 'Merge events' = event_filter_link EventFilter.comments, 'Comments' = event_filter_link EventFilter.team, 'Team' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/projects/0000755000175600017570000000000012672631600025625 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/projects/_project.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/projects/_project.html.ha0000644000175600017570000000406312672631600030712 0ustar pravipravi- avatar = true unless local_assigns[:avatar] == false - stars = true unless local_assigns[:stars] == false - forks = false unless local_assigns[:forks] == true - ci = false unless local_assigns[:ci] == true - skip_namespace = false unless local_assigns[:skip_namespace] == true - css_class = '' unless local_assigns[:css_class] - show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true && project.commit - css_class += " no-description" if project.description.blank? && !show_last_commit_as_description - ci_commit = project.ci_commit(project.commit.sha) if ci && !project.empty_repo? && project.commit - cache_key = [project.namespace, project, controller.controller_name, controller.action_name, current_application_settings, 'v2.2'] - cache_key.push(ci_commit.status) if ci_commit %li.project-row{ class: css_class } = cache(cache_key) do = link_to project_path(project), class: dom_class(project) do - if avatar .dash-project-avatar - if use_creator_avatar = image_tag avatar_icon(project.creator.email, 40), class: "avatar s40", alt:'' - else = project_icon(project, alt: '', class: 'avatar project-avatar s40') %span.project-full-name %span.namespace-name - if project.namespace && !skip_namespace = project.namespace.human_name \/ %span.project-name.filter-title = project.name .project-controls - if ci_commit %span = render_ci_status(ci_commit) - if forks %span = icon('code-fork') = project.forks_count - if stars %span = icon('star') = project.star_count - if show_last_commit_as_description .project-description = link_to_gfm project.commit.title, namespace_project_commit_path(project.namespace, project, project.commit), class: "commit-row-message" - elsif project.description.present? .project-description = markdown(project.description, pipeline: :description) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/projects/_list.html.haml0000644000175600017570000000256412672631600030554 0ustar pravipravi- projects_limit = 20 unless local_assigns[:projects_limit] - avatar = true unless local_assigns[:avatar] == false - use_creator_avatar = false unless local_assigns[:use_creator_avatar] == true - stars = true unless local_assigns[:stars] == false - forks = false unless local_assigns[:forks] == true - ci = false unless local_assigns[:ci] == true - skip_namespace = false unless local_assigns[:skip_namespace] == true - show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true %ul.projects-list - if projects.any? - projects.each_with_index do |project, i| - css_class = (i >= projects_limit) ? 'hide' : nil = render "shared/projects/project", project: project, skip_namespace: skip_namespace, avatar: avatar, stars: stars, css_class: css_class, ci: ci, use_creator_avatar: use_creator_avatar, forks: forks, show_last_commit_as_description: show_last_commit_as_description - if projects.size > projects_limit && projects.kind_of?(Array) %li.bottom.center .light #{projects_limit} of #{pluralize(projects.count, 'project')} displayed. = link_to '#', class: 'js-expand' do Show all = paginate projects, theme: "gitlab" if projects.respond_to? :total_pages - else .nothing-here-block No projects found :javascript new ProjectsList(); Dashboard.init(); ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_choose_group_avatar_button.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_choose_group_avatar_butt0000644000175600017570000000041012672631600031141 0ustar pravipravi%a.choose-btn.btn.btn-sm.js-choose-group-avatar-button %i.fa.fa-paperclip %span Choose File ...   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: 'js-group-avatar-input hidden' .light The maximum file size allowed is 200KB. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_logo.svg0000644000175600017570000000151612672631600025617 0ustar pravipravi gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_show_aside.html.haml0000644000175600017570000000010112672631600030056 0ustar pravipravi= link_to '#aside', class: 'show-aside' do %i.fa.fa-angle-left ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_outdated_browser.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_outdated_browser.html.ha0000644000175600017570000000052212672631600030763 0ustar pravipravi- if outdated_browser? - link = "https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/requirements.md#supported-web-browsers" .browser-alert GitLab may not work properly because you are using an outdated web browser. %br Please install a = link_to 'supported web browser', link for a better experience. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_sort_dropdown.html.haml0000644000175600017570000000214112672631600030642 0ustar pravipravi.dropdown.inline.prepend-left-10 %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_created %b.caret %ul.dropdown-menu.dropdown-menu-align-right %li = link_to page_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created = link_to page_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created = link_to page_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated = link_to page_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated = link_to page_filter_path(sort: sort_value_milestone_soon) do = sort_title_milestone_soon = link_to page_filter_path(sort: sort_value_milestone_later) do = sort_title_milestone_later = link_to page_filter_path(sort: sort_value_upvotes) do = sort_title_upvotes = link_to page_filter_path(sort: sort_value_downvotes) do = sort_title_downvotes gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_field.html.haml0000644000175600017570000000200012672631600027014 0ustar pravipravi- name = field[:name] - title = field[:title] || name.humanize - value = @service.send(name) - type = field[:type] - placeholder = field[:placeholder] - choices = field[:choices] - default_choice = field[:default_choice] - help = field[:help] .form-group - if type == "password" && value.present? = form.label name, "Change #{title}", class: "control-label" - else = form.label name, title, class: "control-label" .col-sm-10 - if type == 'text' = form.text_field name, class: "form-control", placeholder: placeholder - elsif type == 'textarea' = form.text_area name, rows: 5, class: "form-control", placeholder: placeholder - elsif type == 'checkbox' = form.check_box name - elsif type == 'select' = form.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control" } - elsif type == 'password' = form.password_field name, autocomplete: "new-password", class: 'form-control' - if help %span.help-block= help ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_new_project_item_select.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_new_project_item_select.0000644000175600017570000000124512672631600031032 0ustar pravipravi- if @projects.any? .prepend-left-10.project-item-select-holder = project_select_tag :project_path, class: "project-item-select", data: { include_groups: local_assigns[:include_groups], order_by: 'last_activity_at' } %a.btn.btn-new.new-project-item-select-button = icon('plus') = local_assigns[:label] %b.caret :javascript $('.new-project-item-select-button').on('click', function() { $('.project-item-select').select2('open'); }); var relativePath = '#{local_assigns[:path]}'; $('.project-item-select').on('click', function() { window.location = $(this).val() + '/' + relativePath; }); new ProjectSelect() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/0000755000175600017570000000000012672631600025641 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_header.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_header.html.ham0000644000175600017570000000211112672631600030655 0ustar pravipravi.detail-page-header .snippet-box.has_tooltip{class: visibility_level_color(@snippet.visibility_level), title: snippet_visibility_level_description(@snippet.visibility_level, @snippet), data: { container: 'body' }} = visibility_level_icon(@snippet.visibility_level, fw: false) = visibility_level_label(@snippet.visibility_level) %span.identifier Snippet ##{@snippet.id} %span.creator · created by #{link_to_member(@project, @snippet.author, size: 24)} · = time_ago_with_tooltip(@snippet.created_at, placement: 'bottom', html_class: 'snippet_updated_ago') - if @snippet.updated_at != @snippet.created_at %span · = icon('edit', title: 'edited') = time_ago_with_tooltip(@snippet.updated_at, placement: 'bottom', html_class: 'snippet_edited_ago') .pull-right - if @snippet.project_id? = render "projects/snippets/actions" - else = render "snippets/actions" .detail-page-description.gray-content-block.second-block %h2.title = markdown escape_once(@snippet.title), pipeline: :single_line gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_blob.html.haml0000644000175600017570000000042112672631600030521 0ustar pravipravi- unless @snippet.content.empty? - if markup?(@snippet.file_name) .file-content.wiki = render_markup(@snippet.file_name, @snippet.data) - else = render 'shared/file_highlight', blob: @snippet - else .file-content.code .nothing-here-block Empty file gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_form.html.haml0000644000175600017570000000316212672631600030553 0ustar pravipravi.snippet-form-holder = form_for @snippet, url: url, html: { class: "form-horizontal snippet-form js-requires-input" } do |f| - if @snippet.errors.any? .alert.alert-danger %ul - @snippet.errors.full_messages.each do |msg| %li= msg .form-group = f.label :title, class: 'control-label' .col-sm-10 = f.text_field :title, class: 'form-control', required: true, autofocus: true = render 'shared/visibility_level', f: f, visibility_level: visibility_level, can_change_visibility_level: true, form_model: @snippet .file-editor .form-group = f.label :file_name, "File", class: 'control-label' .col-sm-10 .file-holder.snippet .file-title = f.text_field :file_name, placeholder: "Optionally name this file to add code highlighting, e.g. example.rb for Ruby.", class: 'form-control snippet-file-name' .file-content.code %pre#editor= @snippet.content = f.hidden_field :content, class: 'snippet-file-content' .form-actions - if @snippet.new_record? = f.submit 'Create snippet', class: "btn-create btn" - else = f.submit 'Save changes', class: "btn-save btn" - if @snippet.project_id = link_to "Cancel", namespace_project_snippets_path(@project.namespace, @project), class: "btn btn-cancel" - else = link_to "Cancel", snippets_path(@project), class: "btn btn-cancel" :javascript var editor = ace.edit("editor"); $(".snippet-form-holder form").submit(function(){ $(".snippet-file-content").val(editor.getValue()); }); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_snippet.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/snippets/_snippet.html.ha0000644000175600017570000000127012672631600030737 0ustar pravipravi%li.snippet-row .snippet-title = link_to reliable_snippet_path(snippet) do = truncate(snippet.title, length: 60) - if snippet.private? %span.label.label-gray %i.fa.fa-lock private %span.monospace.pull-right = snippet.file_name %small.pull-right.cgray - if snippet.project_id? = link_to snippet.project.name_with_namespace, namespace_project_path(snippet.project.namespace, snippet.project) .snippet-info = link_to user_snippets_path(snippet.author) do = image_tag avatar_icon(snippet.author_email), class: "avatar s24", alt: '' = snippet.author_name authored #{time_ago_with_tooltip(snippet.created_at)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_no_password.html.haml0000644000175600017570000000102112672631600030271 0ustar pravipravi- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password? .no-password-message.alert.alert-warning.hidden-xs You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account .pull-right = link_to "Don't show again", profile_path(user: {hide_no_password: true}), method: :put | = link_to 'Remind later', '#', class: 'hide-no-password-message' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_merge_requests.html.haml0000644000175600017570000000135412672631600030776 0ustar pravipravi- if @merge_requests.any? - @merge_requests.group_by(&:target_project).each do |group| .panel.panel-default.panel-small - project = group[0] .panel-heading = link_to project.name_with_namespace, namespace_project_merge_requests_path(project.namespace, project) - if can?(current_user, :create_merge_request, project) .pull-right = link_to 'New merge request', new_namespace_project_merge_request_path(project.namespace, project) %ul.well-list.mr-list - group[1].each do |merge_request| = render 'projects/merge_requests/merge_request', merge_request: merge_request = paginate @merge_requests, theme: "gitlab" - else .nothing-here-block No merge requests to show ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_milestone_expired.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_milestone_expired.html.h0000644000175600017570000000020612672631600030764 0ustar pravipravi- if milestone.expired? and not milestone.closed? %span.cred (Expired) - if milestone.expires_at %span = milestone.expires_at gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_confirm_modal.html.haml0000644000175600017570000000137412672631600030557 0ustar pravipravi#modal-confirm-danger.modal{tabindex: -1} .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title Confirmation required .modal-body %p.cred.lead.js-confirm-text %p This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention. %br Please type %code.js-confirm-danger-match #{phrase} to proceed or close this modal to cancel. .form-group = text_field_tag 'confirm_name_input', '', class: 'form-control js-confirm-danger-input' .form-actions = submit_tag 'Confirm', class: "btn btn-danger js-confirm-danger-submit" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_new_commit_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/shared/_new_commit_form.html.ham0000644000175600017570000000177512672631600030763 0ustar pravipravi= render 'shared/commit_message_container', placeholder: placeholder - if @project.empty_repo? = hidden_field_tag 'target_branch', @ref - else - if can?(current_user, :push_code, @project) .form-group.branch = label_tag 'target_branch', 'Target branch', class: 'control-label' .col-sm-10 = text_field_tag 'target_branch', @target_branch || tree_edit_branch, required: true, class: "form-control js-target-branch" .js-create-merge-request-container .checkbox - nonce = SecureRandom.hex = label_tag "create_merge_request-#{nonce}" do = check_box_tag 'create_merge_request', 1, true, class: 'js-create-merge-request', id: "create_merge_request-#{nonce}" Start a new merge request with these changes - else = hidden_field_tag 'target_branch', @target_branch || tree_edit_branch = hidden_field_tag 'create_merge_request', 1 = hidden_field_tag 'original_branch', @ref, class: 'js-original-branch' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/0000755000175600017570000000000012672631600024045 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/show.atom.builder0000644000175600017570000000103012672631600027326 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@group.name} activity" xml.link href: group_url(@group, format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: group_url(@group), rel: "alternate", type: "text/html" xml.id group_url(@group) xml.updated @events[0].updated_at.xmlschema if @events[0] @events.each do |event| event_to_atom(xml, event) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/0000755000175600017570000000000012672631600026713 5ustar pravipravi././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/_new_group_member.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/_new_group_0000644000175600017570000000162412672631600031144 0ustar pravipravi= form_for @group_member, url: group_group_members_path(@group), html: { class: 'form-horizontal users-group-form' } do |f| .form-group = f.label :user_ids, "People", class: 'control-label' .col-sm-10 = users_select_tag(:user_ids, multiple: true, class: 'input-large', scope: :all, email_user: true) .help-block Search for users by name, username, or email, or invite new ones using their email address. .form-group = f.label :access_level, "Group Access", class: 'control-label' .col-sm-10 = select_tag :access_level, options_for_select(GroupMember.access_level_roles, @group_member.access_level), class: "project-access-select select2" .help-block Read more about role permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" .form-actions = f.submit 'Add users to group', class: "btn btn-create" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/index.html.0000644000175600017570000000257412672631600030776 0ustar pravipravi- page_title "Members" - header_title group_title(@group, "Members", group_group_members_path(@group)) .group-members-page.prepend-top-default - if current_user && current_user.can?(:admin_group_member, @group) .panel.panel-default .panel-heading Add new user to group .panel-body - if should_user_see_group_roles?(current_user, @group) %p.light Members of group have access to all group projects. .new-group-member-holder = render "new_group_member" .panel.panel-default .panel-heading %strong #{@group.name} group members %small (#{@members.total_count}) .controls = form_tag group_group_members_path(@group), method: :get, class: 'form-inline member-search-form' do .form-group = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control', spellcheck: false } = button_tag class: 'btn', title: 'Search' do = icon("search") %ul.content-list - @members.each do |member| = render 'groups/group_members/group_member', member: member, show_controls: true = paginate @members, theme: 'gitlab' :javascript $('form.member-search-form').on('submit', function(event) { event.preventDefault(); Turbolinks.visit(this.action + '?' + $(this).serialize()); }); ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/update.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/update.js.h0000644000175600017570000000022012672631600030753 0ustar pravipravi:plain $("##{dom_id(@group_member)}").replaceWith('#{escape_javascript(render(@group_member, member: @group_member, show_controls: true))}'); ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/_group_member.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/group_members/_group_memb0000644000175600017570000000500612672631600031132 0ustar pravipravi- user = member.user - return unless user || member.invite? - show_roles = local_assigns.fetch(:show_roles, true) %li{class: "#{dom_class(member)} js-toggle-container", id: dom_id(member)} %span{class: ("list-item-name" if show_controls)} - if member.user = image_tag avatar_icon(user, 24), class: "avatar s24", alt: '' %strong = link_to user.name, user_path(user) %span.cgray= user.username - if user == current_user %span.label.label-success It's you - if user.blocked? %label.label.label-danger %strong Blocked - else = image_tag avatar_icon(member.invite_email, 24), class: "avatar s24", alt: '' %strong = member.invite_email %span.cgray invited - if member.created_by by = link_to member.created_by.name, user_path(member.created_by) = time_ago_with_tooltip(member.created_at) - if show_controls && can?(current_user, :admin_group_member, @group) = link_to resend_invite_group_group_member_path(@group, member), method: :post, class: "btn-xs btn", title: 'Resend invite' do Resend invite - if show_roles && should_user_see_group_roles?(current_user, @group) %span.pull-right %strong.member-access-level= member.human_access - if show_controls - if can?(current_user, :update_group_member, member) = button_tag class: "btn-xs btn js-toggle-button", title: 'Edit access level', type: 'button' do %i.fa.fa-pencil-square-o - if can?(current_user, :destroy_group_member, member)   - if current_user == user = link_to leave_group_group_members_path(@group), data: { confirm: leave_group_message(@group.name)}, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from group' do = icon("sign-out") Leave - else = link_to group_group_member_path(@group, member), data: { confirm: remove_user_from_group_message(@group, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do %i.fa.fa-minus.fa-inverse .edit-member.hide.js-toggle-content %br = form_for [@group, member], remote: true do |f| .prepend-top-10 = f.select :access_level, options_for_select(GroupMember.access_level_roles, member.access_level), {}, class: 'form-control' .prepend-top-10 = f.submit 'Save', class: 'btn btn-save btn-sm' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/issues.atom.builder0000644000175600017570000000102712672631600027667 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@user.name} issues" xml.link href: issues_dashboard_url(format: :atom, private_token: @user.private_token), rel: "self", type: "application/atom+xml" xml.link href: issues_dashboard_url, rel: "alternate", type: "text/html" xml.id issues_dashboard_url xml.updated @issues.first.created_at.xmlschema if @issues.any? @issues.each do |issue| issue_to_atom(xml, issue) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/edit.html.haml0000644000175600017570000000273112672631600026603 0ustar pravipravi- header_title group_title(@group, "Settings", edit_group_path(@group)) .panel.panel-default.prepend-top-default .panel-heading Group settings .panel-body = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| - if @group.errors.any? .alert.alert-danger %span= @group.errors.full_messages.first = render 'shared/group_form', f: f .form-group .col-sm-offset-2.col-sm-10 = image_tag group_icon(@group), alt: '', class: 'avatar group-avatar s160' %p.light - if @group.avatar? You can change your group avatar here - else You can upload a group avatar here = render 'shared/choose_group_avatar_button', f: f - if @group.avatar? %hr = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" .form-actions = f.submit 'Save group', class: "btn btn-save" .panel.panel-danger .panel-heading Remove group .panel-body %p Removing group will cause all child projects and resources to be removed. %br %strong Removed group can not be restored! .form-actions = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/new.html.haml0000644000175600017570000000135012672631600026443 0ustar pravipravi- page_title 'New Group' - header_title "Groups", dashboard_groups_path %h3.page-title New Group %hr = form_for @group, html: { class: 'group-form form-horizontal' } do |f| - if @group.errors.any? .alert.alert-danger %span= @group.errors.full_messages.first = render 'shared/group_form', f: f, autofocus: true .form-group.group-description-holder = f.label :avatar, "Group avatar", class: 'control-label' .col-sm-10 = render 'shared/choose_group_avatar_button', f: f .form-group .col-sm-offset-2.col-sm-10 = render 'shared/group_tips' .form-actions = f.submit 'Create group', class: "btn btn-create", tabindex: 3 = link_to 'Cancel', dashboard_groups_path, class: 'btn btn-cancel' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/projects.html.haml0000644000175600017570000000260012672631600027502 0ustar pravipravi- page_title "Projects" - header_title group_title(@group, "Projects", projects_group_path(@group)) .panel.panel-default.prepend-top-default .panel-heading %strong= @group.name projects: - if can? current_user, :admin_group, @group .controls = link_to new_project_path(namespace_id: @group.id), class: "btn btn-sm btn-success" do = icon('plus') New Project %ul.well-list - @projects.each do |project| %li .list-item-name %span{ class: visibility_level_color(project.visibility_level) } = visibility_level_icon(project.visibility_level) %strong= link_to project.name_with_namespace, project .pull-right - if project.archived %span.label.label-warning archived %span.label.label-gray = repository_size(project) = link_to 'Members', namespace_project_project_members_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-sm btn-remove" - if @projects.blank? .nothing-here-block This group has no projects yet = paginate @projects, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/0000755000175600017570000000000012672631600026227 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_issues.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_issues.html.h0000644000175600017570000000026412672631600031017 0ustar pravipravi.panel.panel-default .panel-heading= title %ul{ class: "well-list issues-sortable-list" } - if issues - issues.each do |issue| = render 'issue', issue: issue ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_milestone.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_milestone.htm0000644000175600017570000000267712672631600031113 0ustar pravipravi%li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } .row .col-sm-6 %strong = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) .col-sm-6 .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' · = link_to merge_requests_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' .col-sm-6 = milestone_progress_bar(milestone) .row .col-sm-6 %div - milestone.milestones.each do |milestone| = link_to milestone_path(milestone) do %span.label.label-gray = milestone.project.name .col-sm-6 - if can?(current_user, :admin_milestones, @group) - if milestone.closed? = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-xs btn-grouped btn-reopen" - else = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-xs btn-close" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/new.html.haml0000644000175600017570000000344012672631600030627 0ustar pravipravi- page_title "Milestones" - header_title group_title(@group, "Milestones", group_milestones_path(@group)) %h3.page-title New Milestone %p.light This will create milestone in every selected project %hr = form_for @milestone, url: group_milestones_path(@group), html: { class: 'form-horizontal milestone-form gfm-form js-requires-input' } do |f| .row .col-md-6 .form-group = f.label :title, "Title", class: "control-label" .col-sm-10 = f.text_field :title, maxlength: 255, class: "form-control js-quick-submit", required: true, autofocus: true .form-group.milestone-description = f.label :description, "Description", class: "control-label" .col-sm-10 = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control js-quick-submit' .clearfix .error-alert .form-group = f.label :projects, "Projects", class: "control-label" .col-sm-10 = f.collection_select :project_ids, @group.projects, :id, :name, { selected: @group.projects.map(&:id) }, multiple: true, class: 'select2' .col-md-6 .form-group = f.label :due_date, "Due Date", class: "control-label" .col-sm-10= f.hidden_field :due_date .col-sm-10 .datepicker .form-actions = f.submit 'Create Milestone', class: "btn-create btn" = link_to "Cancel", group_milestones_path(@group), class: "btn btn-cancel" :javascript $(".datepicker").datepicker({ dateFormat: "yy-mm-dd", onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_issue.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_issue.html.ha0000644000175600017570000000100112672631600030763 0ustar pravipravi%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid } %span.milestone-row - project = issue.project %strong #{project.name} · = link_to [project.namespace.becomes(Namespace), project, issue] do %span.cgray ##{issue.iid} = link_to_gfm issue.title, [project.namespace.becomes(Namespace), project, issue], title: issue.title .pull-right.assignee-icon - if issue.assignee = image_tag avatar_icon(issue.assignee, 16), class: "avatar s16", alt: '' ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_header_title.0000644000175600017570000000012012672631600031011 0ustar pravipravi- header_title group_title(@group, "Milestones", group_milestones_path(@group)) ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/index.html.ham0000644000175600017570000000130012672631600030762 0ustar pravipravi- page_title "Milestones" - header_title group_title(@group, "Milestones", group_milestones_path(@group)) .top-area = render 'shared/milestones_filter' .nav-controls - if can?(current_user, :admin_milestones, @group) = link_to new_group_milestone_path(@group), class: "btn btn-new" do = icon('plus') New Milestone .gray-content-block Only milestones from %strong #{@group.name} group are listed here. .milestones %ul.content-list - if @milestones.blank? %li .nothing-here-block No milestones to show - else - @milestones.each do |milestone| = render 'milestone', milestone: milestone = paginate @milestones, theme: "gitlab" ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_merge_request.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_merge_request0000644000175600017570000000111712672631600031160 0ustar pravipravi%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid } %span.milestone-row - project = merge_request.project %strong #{project.name} · = link_to [project.namespace.becomes(Namespace), project, merge_request] do %span.cgray ##{merge_request.iid} = link_to_gfm merge_request.title, [project.namespace.becomes(Namespace), project, merge_request], title: merge_request.title .pull-right.assignee-icon - if merge_request.assignee = image_tag avatar_icon(merge_request.assignee, 16), class: "avatar s16", alt: '' ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/_merge_request0000644000175600017570000000035412672631600031162 0ustar pravipravi.panel.panel-default .panel-heading= title %ul{ class: "well-list merge_requests-sortable-list" } - if merge_requests - merge_requests.each do |merge_request| = render 'merge_request', merge_request: merge_request gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/milestones/show.html.haml0000644000175600017570000000723312672631600031022 0ustar pravipravi- page_title @milestone.title, "Milestones" = render "header_title" .detail-page-header .status-box{ class: "status-box-#{@milestone.closed? ? 'closed' : 'open'}" } - if @milestone.closed? Closed - else Open %span.identifier Milestone #{@milestone.title} .pull-right - if can?(current_user, :admin_milestones, @group) - if @milestone.active? = link_to 'Close Milestone', group_milestone_path(@group, @milestone.safe_title, title: @milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close" - else = link_to 'Reopen Milestone', group_milestone_path(@group, @milestone.safe_title, title: @milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen" .detail-page-description.gray-content-block.second-block %h2.title = markdown escape_once(@milestone.title), pipeline: :single_line - if @milestone.complete? && @milestone.active? .alert.alert-success.prepend-top-default %span All issues for this milestone are closed. You may close the milestone now. .table-holder %table.table %thead %tr %th Project %th Open issues %th State %th Due date - @milestone.milestones.each do |milestone| %tr %td = link_to "#{milestone.project.name}", namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) %td = milestone.issues.opened.count %td - if milestone.closed? Closed - else Open %td = milestone.expires_at .context %p.lead Progress: #{@milestone.closed_items_count} closed – #{@milestone.open_items_count} open = milestone_progress_bar(@milestone) %ul.nav-links.no-top.no-bottom %li.active = link_to '#tab-issues', 'data-toggle' => 'tab' do Issues %span.badge= @milestone.issue_count %li = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do Merge Requests %span.badge= @milestone.merge_requests_count %li = link_to '#tab-participants', 'data-toggle' => 'tab' do Participants %span.badge= @milestone.participants.count .tab-content .tab-pane.active#tab-issues .gray-content-block.middle-block .pull-right = link_to 'Browse Issues', issues_group_path(@group, milestone_title: @milestone.title), class: "btn btn-grouped" .oneline All issues in this milestone .row.prepend-top-default .col-md-6 = render 'issues', title: "Open", issues: @milestone.opened_issues .col-md-6 = render 'issues', title: "Closed", issues: @milestone.closed_issues .tab-pane#tab-merge-requests .gray-content-block.middle-block .pull-right = link_to 'Browse Merge Requests', merge_requests_group_path(@group, milestone_title: @milestone.title), class: "btn btn-grouped" .oneline All merge requests in this milestone .row.prepend-top-default .col-md-6 = render 'merge_requests', title: "Open", merge_requests: @milestone.opened_merge_requests .col-md-6 = render 'merge_requests', title: "Closed", merge_requests: @milestone.closed_merge_requests .tab-pane#tab-participants .gray-content-block.middle-block .oneline All participants to this milestone %ul.bordered-list - @milestone.participants.each do |user| %li = link_to user, title: user.name, class: "darken" do = image_tag avatar_icon(user, 32), class: "avatar s32" %strong= truncate(user.name, lenght: 40) %br %small.cgray= user.username gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/_projects.html.haml0000644000175600017570000000120512672631600027641 0ustar pravipravi.top-area .nav-controls = form_tag request.original_url, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f| - if @projects.present? = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control', spellcheck: false - if can? current_user, :create_projects, @group = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-new pull-right' do = icon('plus') New Project .projects-list-holder = render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false, skip_namespace: true gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/issues.html.haml0000644000175600017570000000164112672631600027170 0ustar pravipravi- page_title "Issues" - header_title group_title(@group, "Issues", issues_group_path(@group)) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} issues") .top-area = render 'shared/issuable/nav', type: :issues .nav-controls - if current_user = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token), class: 'btn' do = icon('rss') = render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue" = render 'shared/issuable/filter', type: :issues .gray-content-block.second-block Only issues from %strong #{@group.name} group are listed here. - if current_user To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. .prepend-top-default = render 'shared/issues' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/show.html.haml0000644000175600017570000000317712672631600026643 0ustar pravipravi- @no_container = true - unless can?(current_user, :read_group, @group) - @disable_search_panel = true = content_for :meta_tags do - 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 .cover-controls - if @group && can?(current_user, :admin_group, @group) = link_to icon('pencil'), edit_group_path(@group), class: 'btn' - if current_user = link_to icon('rss'), group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'btn rss-btn' .avatar-holder = link_to group_icon(@group), target: '_blank' do = image_tag group_icon(@group), class: "avatar group-avatar s90" .cover-title = @group.name .cover-desc.username @#{@group.path} - if @group.description.present? .cover-desc.description = markdown(@group.description, pipeline: :description) %ul.nav-links %li.active = link_to "#activity", 'data-toggle' => 'tab' do Activity %li = link_to "#projects", 'data-toggle' => 'tab' do Projects - if can?(current_user, :read_group, @group) %div{ class: container_class } .tab-content .tab-pane.active#activity .activity-filter-block - if current_user = render "events/event_last_push", event: @last_push = render 'shared/event_filter' .content_list{data: {href: events_group_path}} = spinner .tab-pane#projects = render "projects", projects: @projects - else %p.nav-links.no-top No projects to show gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/groups/merge_requests.html.haml0000644000175600017570000000122012672631600030700 0ustar pravipravi- page_title "Merge Requests" - header_title group_title(@group, "Merge Requests", merge_requests_group_path(@group)) .top-area = render 'shared/issuable/nav', type: :merge_requests .nav-controls = render 'shared/new_project_item_select', path: 'merge_requests/new', label: "New Merge Request" = render 'shared/issuable/filter', type: :merge_requests .gray-content-block.second-block Only merge requests from %strong #{@group.name} group are listed here. - if current_user To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. .prepend-top-default = render 'shared/merge_requests' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/0000755000175600017570000000000012672631600024005 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/unlocks/0000755000175600017570000000000012672631600025463 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/unlocks/new.html.haml0000644000175600017570000000106512672631600030064 0ustar pravipravi.login-box .login-heading %h3 Resend unlock email .login-body = form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| .devise-errors = devise_error_messages! .clearfix.append-bottom-20 = f.email_field :email, class: 'form-control', placeholder: 'Email', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off' .clearfix = f.submit 'Resend unlock instructions', class: 'btn btn-success' .clearfix.prepend-top-20 = render 'devise/shared/sign_in_link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/0000755000175600017570000000000012672631600025256 5ustar pravipravi././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/unlock_instructions.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/unlock_instruction0000644000175600017570000000054112672631600031135 0ustar pravipravi%p Hello #{@resource.name}! %p Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in = time_ago_in_words(Devise.unlock_in.from_now) or you may click the link below to unlock now. %p= link_to 'Unlock your account', unlock_url(@resource, unlock_token: @token) ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/reset_password_instructions.html.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/reset_password_ins0000644000175600017570000000061712672631600031122 0ustar pravipravi

Hello <%= @resource.email %>!

Someone has requested a link to change your password, and you can do this through the link below.

<%= link_to 'Change your password', edit_password_url(@resource, reset_password_token: @token) %>

If you didn't request this, please ignore this email.

Your password won't change until you access the link above and create a new one.

././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/confirmation_instructions.html.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/mailer/confirmation_instr0000644000175600017570000000056012672631600031111 0ustar pravipravi

Welcome <%= @resource.name %>!

<% if @resource.unconfirmed_email.present? %>

You can confirm your email (<%= @resource.unconfirmed_email %>) through the link below:

<% else %>

You can confirm your account through the link below:

<% end %>

<%= link_to 'Confirm your account', confirmation_url(@resource, confirmation_token: @token) %>

gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/confirmations/0000755000175600017570000000000012672631600026660 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/confirmations/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/confirmations/new.html.ha0000644000175600017570000000103312672631600030723 0ustar pravipravi.login-box .login-heading %h3 Resend confirmation instructions .login-body = form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| .devise-errors = devise_error_messages! .clearfix.append-bottom-20 = f.email_field :email, placeholder: 'Email', class: "form-control", required: true .clearfix = f.submit "Resend confirmation instructions", class: 'btn btn-success' .clearfix.prepend-top-20 = render 'devise/shared/sign_in_link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/0000755000175600017570000000000012672631600025653 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/new.html.haml0000644000175600017570000000132412672631600030252 0ustar pravipravi- page_title "Sign in" %div - if signin_enabled? || ldap_enabled? || crowd_enabled? = render 'devise/shared/signin_box' -# Omniauth fits between signin/ldap signin and signup and does not have a surrounding box - if omniauth_enabled? && devise_mapping.omniauthable? .clearfix.prepend-top-20 = render 'devise/shared/omniauth_box' -# Signup only makes sense if you can also sign-in - if signin_enabled? && signup_enabled? .prepend-top-20 = render 'devise/shared/signup_box' -# Show a message if none of the mechanisms above are enabled - if !signin_enabled? && !ldap_enabled? && !(omniauth_enabled? && devise_mapping.omniauthable?) %div No authentication methods configured. ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_ldap.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_ldap.html.h0000644000175600017570000000104612672631600030720 0ustar pravipravi= form_tag(user_omniauth_callback_path(server['provider_name']), id: 'new_ldap_user' ) do = text_field_tag :username, nil, {class: "form-control top", placeholder: "#{server['label']} Login", autofocus: "autofocus"} = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} - if devise_mapping.rememberable? .remember-me.checkbox %label{for: "remember_me"} = check_box_tag :remember_me, '1', false, id: 'remember_me' %span Remember me = button_tag "Sign in", class: "btn-save btn" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/two_factor.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/two_factor.html.0000644000175600017570000000077412672631600030776 0ustar pravipravi%div .login-box .login-heading %h3 Two-factor Authentication .login-body = form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f| = f.text_field :otp_attempt, class: 'form-control', placeholder: 'Two-factor authentication code', required: true, autofocus: true %p.help-block.hint If you've lost your phone, you may enter one of your recovery codes. .prepend-top-20 = f.submit "Verify code", class: "btn btn-save" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_crowd.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_crowd.html.0000644000175600017570000000100712672631600030743 0ustar pravipravi= form_tag(user_omniauth_authorize_path("crowd"), id: 'new_crowd_user' ) do = text_field_tag :username, nil, {class: "form-control top", placeholder: "Username", autofocus: "autofocus"} = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} - if devise_mapping.rememberable? .remember-me.checkbox %label{for: "remember_me"} = check_box_tag :remember_me, '1', false, id: 'remember_me' %span Remember me = button_tag "Sign in", class: "btn-save btn"././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_base.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/sessions/_new_base.html.h0000644000175600017570000000116512672631600030714 0ustar pravipravi= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| = f.text_field :login, class: "form-control top", placeholder: "Username or Email", autofocus: "autofocus", autocapitalize: "off", autocorrect: "off" = f.password_field :password, class: "form-control bottom", placeholder: "Password" - if devise_mapping.rememberable? .remember-me.checkbox %label{for: "user_remember_me"} = f.check_box :remember_me %span Remember me .pull-right = link_to "Forgot your password?", new_password_path(resource_name) %div = f.submit "Sign in", class: "btn btn-save" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/0000755000175600017570000000000012672631600025253 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_links.erb0000644000175600017570000000162412672631600027227 0ustar pravipravi<%- if controller_name != 'sessions' %> <%= link_to "Sign in", new_session_path(resource_name), class: "btn" %>
<% end -%> <%- if devise_mapping.registerable? && controller_name != 'registrations' && gitlab_config.signup_enabled %> <%= link_to "Sign up", new_registration_path(resource_name) %>
<% end -%> <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> <%= link_to "Forgot your password?", new_password_path(resource_name), class: "btn" %>
<% end -%> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %>
<% end -%> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
<% end -%> ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_signup_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_signup_box.html.h0000644000175600017570000000243412672631600030706 0ustar pravipravi.login-box - if signin_enabled? .login-heading %h3 New user? Create an account - else .login-heading %h3 Create an account .login-body - user = params[:user].present? ? params[:user] : {} = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| .devise-errors = devise_error_messages! %div = f.text_field :name, class: "form-control top", value: user[:name], placeholder: "Name", required: true %div = f.text_field :username, class: "form-control middle", value: user[:username], placeholder: "Username", required: true %div = f.email_field :email, class: "form-control middle", value: user[:email], placeholder: "Email", required: true .form-group.append-bottom-20#password-strength = f.password_field :password, class: "form-control bottom", value: user[:password], id: "user_password_sign_up", placeholder: "Password", required: true %div - if current_application_settings.recaptcha_enabled = recaptcha_tags %div = f.submit "Sign up", class: "btn-create btn" .clearfix.prepend-top-20 %p %span.light Didn't receive a confirmation email? = succeed '.' do = link_to "Request a new one", new_confirmation_path(resource_name) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_signin_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_signin_box.html.h0000644000175600017570000000226312672631600030670 0ustar pravipravi.login-box - if signup_enabled? .login-heading %h3 Existing user? Sign in - else .login-heading %h3 Sign in .login-body - if form_based_providers.any? %ul.nav-links - if crowd_enabled? %li.active = link_to "Crowd", "#tab-crowd", 'data-toggle' => 'tab' - @ldap_servers.each_with_index do |server, i| %li{class: (:active if i.zero? && !crowd_enabled?)} = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' - if signin_enabled? %li = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' .tab-content - if crowd_enabled? %div.tab-pane.active{id: "tab-crowd"} = render 'devise/sessions/new_crowd' - @ldap_servers.each_with_index do |server, i| %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero? && !crowd_enabled?)} = render 'devise/sessions/new_ldap', server: server - if signin_enabled? %div#tab-signin.tab-pane = render 'devise/sessions/new_base' - elsif signin_enabled? = render 'devise/sessions/new_base' ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_omniauth_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_omniauth_box.html0000644000175600017570000000054412672631600030777 0ustar pravipravi%p %span.light Sign in with   - providers = button_based_providers - providers.each do |provider| %span.light - has_icon = provider_has_icon?(provider) = link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: (has_icon ? 'oauth-image-link' : 'btn'), "data-no-turbolink" => "true" ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_sign_in_link.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/shared/_sign_in_link.html0000644000175600017570000000017112672631600030742 0ustar pravipravi%p %span.light Already have login and password? %strong = link_to "Sign in", new_session_path(resource_name) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/registrations/0000755000175600017570000000000012672631600026702 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/registrations/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/registrations/new.html.ha0000644000175600017570000000014212672631600030745 0ustar pravipravi- page_title "Sign up" = render 'devise/shared/signup_box' = render 'devise/shared/sign_in_link' ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/registrations/edit.html.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/registrations/edit.html.e0000644000175600017570000000176412672631600030750 0ustar pravipravi

Edit <%= resource_name.to_s.humanize %>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= devise_error_messages! %>
<%= f.label :email %>
<%= f.email_field :email %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :password %> (leave blank if you don't want to change it)
<%= f.password_field :password %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %>
<%= f.label :current_password %> (we need your current password to confirm your changes)
<%= f.password_field :current_password %>
<%= f.submit "Update", class: "input_button" %>
<% end %>

Cancel your account

Unhappy? <%= link_to "Cancel your account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %>.

<%= link_to "Back", :back %> gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/passwords/0000755000175600017570000000000012672631600026032 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/passwords/edit.html.haml0000644000175600017570000000143312672631600030566 0ustar pravipravi.login-box .login-heading %h3 Change your password .login-body = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| .devise-errors = devise_error_messages! = f.hidden_field :reset_password_token %div = f.password_field :password, class: "form-control top", placeholder: "New password", required: true %div = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm new password", required: true .clearfix = f.submit "Change your password", class: "btn btn-primary" .clearfix.prepend-top-20 %p = link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) = render 'devise/shared/sign_in_link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/devise/passwords/new.html.haml0000644000175600017570000000104112672631600030425 0ustar pravipravi.login-box .login-heading %h3 Reset password .login-body = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| .devise-errors = devise_error_messages! .clearfix.append-bottom-20 = f.email_field :email, placeholder: "Email", class: "form-control", required: true, value: params[:user_email], autofocus: true .clearfix = f.submit "Reset password", class: "btn-primary btn" .clearfix.prepend-top-20 = render 'devise/shared/sign_in_link' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/votes/0000755000175600017570000000000012672631600023666 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/votes/_votes_block.html.haml0000644000175600017570000000315312672631600030147 0ustar pravipravi.awards.votes-block - awards_sort(votable.notes.awards.grouped_awards).each do |emoji, notes| .award{class: (note_active_class(notes, current_user)), title: emoji_author_list(notes, current_user)} = emoji_icon(emoji) .counter = notes.count - if current_user .awards-controls %a.add-award{"href" => "#"} = icon('smile-o') .emoji-menu .emoji-menu-content = text_field_tag :emoji_search, "", class: "emoji-search search-input form-control" - AwardEmoji.emoji_by_category.each do |category, emojis| %h5= AwardEmoji::CATEGORIES[category] %ul - emojis.each do |emoji| %li = emoji_icon(emoji["name"], emoji["unicode"], emoji["aliases"]) - if current_user :javascript var post_emoji_url = "#{award_toggle_namespace_project_notes_path(@project.namespace, @project)}"; var noteable_type = "#{votable.class.name.underscore}"; var noteable_id = "#{votable.id}"; var aliases = #{AwardEmoji.aliases.to_json}; window.awards_handler = new AwardsHandler( post_emoji_url, noteable_type, noteable_id, aliases ); $(".awards").on("click", ".emoji-menu-content li", function(e) { var emoji = $(this).find(".emoji-icon").data("emoji"); awards_handler.addAward(emoji); }); $(".awards").on("click", ".award", function(e) { var emoji = $(this).find(".icon").data("emoji"); awards_handler.addAward(emoji); }); $(".award").tooltip(); $(".emoji-menu-content").niceScroll({cursorwidth: "7px", autohidemode: false}); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/0000755000175600017570000000000012672631600024455 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/issues.atom.builder0000644000175600017570000000105312672631600030276 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{current_user.name} issues" xml.link href: issues_dashboard_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: issues_dashboard_url, rel: "alternate", type: "text/html" xml.id issues_dashboard_url xml.updated @issues.first.created_at.xmlschema if @issues.any? @issues.each do |issue| issue_to_atom(xml, issue) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_snippets_head.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_snippets_head.html.ha0000644000175600017570000000055712672631600030726 0ustar pravipravi%ul.nav-links = nav_link(page: dashboard_snippets_path, html_options: {class: 'home'}) do = link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do Your Snippets = nav_link(page: explore_snippets_path) do = link_to explore_snippets_path, title: 'Explore snippets', data: {placement: 'right'} do Explore Snippets ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_activity_head.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_activity_head.html.ha0000644000175600017570000000054012672631600030705 0ustar pravipravi%ul.nav-links %li{ class: ("active" unless params[:filter]) } = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do Your Projects %li{ class: ("active" if params[:filter] == 'starred') } = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do Starred Projects gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/0000755000175600017570000000000012672631600026637 5ustar pravipravi././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_issues.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_issues.htm0000644000175600017570000000026412672631600031025 0ustar pravipravi.panel.panel-default .panel-heading= title %ul{ class: "well-list issues-sortable-list" } - if issues - issues.each do |issue| = render 'issue', issue: issue ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_milestone.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_milestone.0000644000175600017570000000202112672631600030771 0ustar pravipravi%li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } .row .col-sm-6 %strong = link_to_gfm truncate(milestone.title, length: 100), dashboard_milestone_path(milestone.safe_title, title: milestone.title) .col-sm-6 .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' · = link_to merge_requests_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' .col-sm-6 = milestone_progress_bar(milestone) .row .col-sm-6 .expiration = render 'shared/milestone_expired', milestone: milestone .projects - milestone.milestones.each do |milestone| = link_to milestone_path(milestone) do %span.label.label-gray = milestone.project.name_with_namespace ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_issue.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_issue.html0000644000175600017570000000100712672631600031012 0ustar pravipravi%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid } %span.milestone-row - project = issue.project %strong #{project.name_with_namespace} · = link_to [project.namespace.becomes(Namespace), project, issue] do %span.cgray ##{issue.iid} = link_to_gfm issue.title, [project.namespace.becomes(Namespace), project, issue], title: issue.title .pull-right.assignee-icon - if issue.assignee = image_tag avatar_icon(issue.assignee, 16), class: "avatar s16" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/index.html.0000644000175600017570000000101712672631600030711 0ustar pravipravi- page_title "Milestones" - header_title "Milestones", dashboard_milestones_path .top-area = render 'shared/milestones_filter' .nav-controls = render 'shared/new_project_item_select', path: 'milestones/new', label: "New Milestone", include_groups: true .milestones %ul.content-list - if @milestones.blank? %li .nothing-here-block No milestones to show - else - @milestones.each do |milestone| = render 'milestone', milestone: milestone = paginate @milestones, theme: "gitlab" ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_merge_request.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_merge_requ0000644000175600017570000000112512672631600031053 0ustar pravipravi%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid } %span.milestone-row - project = merge_request.project %strong #{project.name_with_namespace} · = link_to [project.namespace.becomes(Namespace), project, merge_request] do %span.cgray ##{merge_request.iid} = link_to_gfm merge_request.title, [project.namespace.becomes(Namespace), project, merge_request], title: merge_request.title .pull-right.assignee-icon - if merge_request.assignee = image_tag avatar_icon(merge_request.assignee, 16), class: "avatar s16" ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/_merge_requ0000644000175600017570000000035412672631600031056 0ustar pravipravi.panel.panel-default .panel-heading= title %ul{ class: "well-list merge_requests-sortable-list" } - if merge_requests - merge_requests.each do |merge_request| = render 'merge_request', merge_request: merge_request ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/milestones/show.html.h0000644000175600017570000000631412672631600030737 0ustar pravipravi- page_title @milestone.title, "Milestones" - header_title "Milestones", dashboard_milestones_path .detail-page-header .status-box{ class: "status-box-#{@milestone.closed? ? 'closed' : 'open'}" } - if @milestone.closed? Closed - else Open %span.identifier Milestone #{@milestone.title} .detail-page-description.gray-content-block.second-block %h2.title = markdown escape_once(@milestone.title), pipeline: :single_line - if @milestone.complete? && @milestone.active? .alert.alert-success.prepend-top-default %span All issues for this milestone are closed. Navigate to the project to close the milestone. .table-holder %table.table %thead %tr %th Project %th Open issues %th State %th Due date - @milestone.milestones.each do |milestone| %tr %td = link_to "#{milestone.project.name_with_namespace}", namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) %td = milestone.issues.opened.count %td - if milestone.closed? Closed - else Open %td = milestone.expires_at .context %p.lead Progress: #{@milestone.closed_items_count} closed – #{@milestone.open_items_count} open = milestone_progress_bar(@milestone) %ul.nav-links.no-top.no-bottom %li.active = link_to '#tab-issues', 'data-toggle' => 'tab' do Issues %span.badge= @milestone.issue_count %li = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do Merge Requests %span.badge= @milestone.merge_requests_count %li = link_to '#tab-participants', 'data-toggle' => 'tab' do Participants %span.badge= @milestone.participants.count .tab-content .tab-pane.active#tab-issues .gray-content-block.middle-block .pull-right = link_to 'Browse Issues', issues_dashboard_path(milestone_title: @milestone.title), class: "btn btn-grouped" .oneline All issues in this milestone .row.prepend-top-default .col-md-6 = render 'issues', title: "Open", issues: @milestone.opened_issues .col-md-6 = render 'issues', title: "Closed", issues: @milestone.closed_issues .tab-pane#tab-merge-requests .gray-content-block.middle-block .pull-right = link_to 'Browse Merge Requests', merge_requests_dashboard_path(milestone_title: @milestone.title), class: "btn btn-grouped" .oneline All merge requests in this milestone .row.prepend-top-default .col-md-6 = render 'merge_requests', title: "Open", merge_requests: @milestone.opened_merge_requests .col-md-6 = render 'merge_requests', title: "Closed", merge_requests: @milestone.closed_merge_requests .tab-pane#tab-participants .gray-content-block.middle-block .oneline All participants to this milestone %ul.bordered-list - @milestone.participants.each do |user| %li = link_to user, title: user.name, class: "darken" do = image_tag avatar_icon(user, 32), class: "avatar s32" %strong= truncate(user.name, lenght: 40) %br %small.cgray= user.username gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/groups/0000755000175600017570000000000012672631600025774 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/groups/index.html.haml0000644000175600017570000000047512672631600030717 0ustar pravipravi- page_title "Groups" - header_title "Groups", dashboard_groups_path = render 'dashboard/groups_head' %ul.content-list - @group_members.each do |group_member| - group = group_member.group = render 'shared/groups/group', group: group, group_member: group_member = paginate @group_members, theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_groups_head.html.haml0000644000175600017570000000067112672631600030726 0ustar pravipravi.top-area %ul.nav-links = nav_link(page: dashboard_groups_path) do = link_to dashboard_groups_path, title: 'Your groups' do Your Groups = nav_link(page: explore_groups_path) do = link_to explore_groups_path, title: 'Explore groups' do Explore Groups - if current_user.can_create_group? .nav-controls = link_to new_group_path, class: "btn btn-new" do = icon('plus') New Group gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_sidebar.html.haml0000644000175600017570000000013512672631600030032 0ustar pravipravi= render "dashboard/projects", projects: @projects .prepend-top-20 = render 'shared/promo' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/0000755000175600017570000000000012672631600026306 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/index.html.ha0000644000175600017570000000075612672631600030702 0ustar pravipravi= content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") - page_title "Projects" - header_title "Projects", dashboard_projects_path = render 'dashboard/projects_head' - if @last_push = render "events/event_last_push", event: @last_push - if @projects.any? || params[:filter_projects] = render 'projects' - else = render "zero_authorized_projects" ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/_zero_authorized_projects.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/_zero_authori0000644000175600017570000000302212672631600031077 0ustar pravipravi- publicish_project_count = Project.publicish(current_user).count %h3.page-title Welcome to GitLab! %p.light Self hosted Git management application. %hr %div .dashboard-intro-icon %i.fa.fa-bookmark-o .dashboard-intro-text %p.slead You don't have access to any projects right now. %br - if current_user.can_create_project? You can create up to %strong= pluralize(current_user.projects_limit, "project") + "." - else If you are added to a project, it will be displayed here. - if current_user.can_create_project? .link_holder = link_to new_project_path, class: "btn btn-new" do %i.fa.fa-plus New Project - if current_user.can_create_group? %hr %div .dashboard-intro-icon %i.fa.fa-users .dashboard-intro-text %p.slead You can create a group for several dependent projects. %br Groups are the best way to manage projects and members. .link_holder = link_to new_group_path, class: "btn btn-new" do %i.fa.fa-plus New Group -if publicish_project_count > 0 %hr %div .dashboard-intro-icon %i.fa.fa-globe .dashboard-intro-text %p.slead There are %strong= publicish_project_count public projects on this server. %br Public projects are an easy way to allow everyone to have read-only access. .link_holder = link_to trending_explore_projects_path, class: "btn btn-new" do Browse public projects ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/index.atom.buildergitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/index.atom.bu0000644000175600017570000000103012672631600030676 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Activity" xml.link href: dashboard_projects_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: dashboard_projects_url, rel: "alternate", type: "text/html" xml.id dashboard_projects_url xml.updated @events[0].updated_at.xmlschema if @events[0] @events.each do |event| event_to_atom(xml, event) end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/_projects.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/_projects.htm0000644000175600017570000000017412672631600031012 0ustar pravipravi.projects-list-holder = render 'shared/projects/list', projects: @projects, ci: true :javascript Dashboard.init() ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/starred.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/projects/starred.html.0000644000175600017570000000056112672631600030720 0ustar pravipravi- page_title "Starred Projects" - header_title "Projects", dashboard_projects_path = render 'dashboard/projects_head' - if @last_push = render "events/event_last_push", event: @last_push - if @projects.any? = render 'projects' - else %h3 You don't have starred projects yet %p.slead Visit project page and press on star icon and it will appear on this page. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/todos/0000755000175600017570000000000012672631600025605 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/todos/_todo.html.haml0000644000175600017570000000130212672631600030513 0ustar pravipravi%li{class: "todo todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) } .todo-item{class: 'todo-block'} = image_tag avatar_icon(todo.author_email, 40), class: 'avatar s40', alt:'' .todo-title %span.author-name - if todo.author = link_to_author(todo) - else (removed) %span.todo-label = todo_action_name(todo) = todo_target_link(todo) · #{time_ago_with_tooltip(todo.created_at)} - if todo.pending? .todo-actions.pull-right = link_to 'Done', [:dashboard, todo], method: :delete, class: 'btn' .todo-body .todo-note .md = event_note(todo.body, project: todo.project) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/todos/index.html.haml0000644000175600017570000000434012672631600030523 0ustar pravipravi- page_title "Todos" - header_title "Todos", dashboard_todos_path .top-area %ul.nav-links %li{class: ('active' if params[:state].blank? || params[:state] == 'pending')} = link_to todos_filter_path(state: 'pending') do %span To do %span{class: 'badge'} = todos_pending_count %li{class: ('active' if params[:state] == 'done')} = link_to todos_filter_path(state: 'done') do %span Done %span{class: 'badge'} = todos_done_count .nav-controls - if @todos.any?(&:pending?) = link_to 'Mark all as done', destroy_all_dashboard_todos_path(todos_filter_params), class: 'btn', method: :delete .todos-filters .gray-content-block.second-block = form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form' do .filter-item.inline = select_tag('project_id', todo_projects_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Project'}) .filter-item.inline = users_select_tag(:author_id, selected: params[:author_id], placeholder: 'Author', class: 'trigger-submit', any_user: "Any Author", first_user: true, current_user: true) .filter-item.inline = select_tag('type', todo_types_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Type'}) .filter-item.inline.actions-filter = select_tag('action_id', todo_actions_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Action'}) .prepend-top-default - if @todos.any? - @todos.group_by(&:project).each do |group| .panel.panel-default.panel-small - project = group[0] .panel-heading = link_to project.name_with_namespace, namespace_project_path(project.namespace, project) %ul.well-list.todos-list = render group[1] = paginate @todos, theme: "gitlab" - else .nothing-here-block You're all done! :javascript new UsersSelect(); $('form.filter-form').on('submit', function (event) { event.preventDefault(); Turbolinks.visit(this.action + '&' + $(this).serialize()); }); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_projects_head.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_projects_head.html.ha0000644000175600017570000000236512672631600030711 0ustar pravipravi= content_for :flash_message do = render 'shared/project_limit' .top-area %ul.nav-links = nav_link(page: [dashboard_projects_path, root_path]) do = link_to dashboard_projects_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do Your Projects = nav_link(page: starred_dashboard_projects_path) do = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do Starred Projects = nav_link(page: [explore_root_path, trending_explore_projects_path, starred_explore_projects_path, explore_projects_path]) do = link_to explore_root_path, title: 'Explore', data: {placement: 'right'} do Explore Projects .nav-controls = form_tag request.original_url, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f| = search_field_tag :filter_projects, params[:filter_projects], placeholder: 'Filter by name...', class: 'project-filter-form-field form-control input-short projects-list-filter', spellcheck: false, id: 'project-filter-form-field' = render 'explore/projects/dropdown' - if current_user.can_create_project? = link_to new_project_path, class: 'btn btn-new' do = icon('plus') New Project gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/_activities.html.haml0000644000175600017570000000046612672631600030574 0ustar pravipravi.hidden-xs = render "events/event_last_push", event: @last_push .nav-block - if current_user .controls = link_to dashboard_projects_path(:atom, { private_token: current_user.private_token }), class: 'btn rss-btn' do %i.fa.fa-rss = render 'shared/event_filter' .content_list = spinner gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/issues.html.haml0000644000175600017570000000131712672631600027600 0ustar pravipravi- page_title "Issues" - header_title "Issues", issues_dashboard_path(assignee_id: current_user.id) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_dashboard_url(format: :atom, private_token: current_user.private_token), title: "#{current_user.name} issues") .top-area = render 'shared/issuable/nav', type: :issues .nav-controls - if current_user = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: 'btn' do = icon('rss') = render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue" = render 'shared/issuable/filter', type: :issues .prepend-top-default = render 'shared/issues' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/activity.html.haml0000644000175600017570000000053712672631600030124 0ustar pravipravi= content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") - page_title "Activity" - header_title "Activity", activity_dashboard_path = render 'dashboard/activity_head' %section.activities = render 'activities' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/snippets/0000755000175600017570000000000012672631600026322 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/snippets/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/snippets/index.html.ha0000644000175600017570000000216412672631600030711 0ustar pravipravi- page_title "Snippets" - header_title "Snippets", dashboard_snippets_path = render 'dashboard/snippets_head' .nav-block .controls = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do = icon('plus') New Snippet .nav-links.snippet-scope-menu %li{ class: ("active" unless params[:scope]) } = link_to dashboard_snippets_path do All %span.badge = current_user.snippets.count %li{ class: ("active" if params[:scope] == "are_private") } = link_to dashboard_snippets_path(scope: 'are_private') do Private %span.badge = current_user.snippets.are_private.count %li{ class: ("active" if params[:scope] == "are_internal") } = link_to dashboard_snippets_path(scope: 'are_internal') do Internal %span.badge = current_user.snippets.are_internal.count %li{ class: ("active" if params[:scope] == "are_public") } = link_to dashboard_snippets_path(scope: 'are_public') do Public %span.badge = current_user.snippets.are_public.count = render 'snippets/snippets' ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/dashboard/merge_requests.html.ha0000644000175600017570000000065012672631600030765 0ustar pravipravi- page_title "Merge Requests" - header_title "Merge Requests", merge_requests_dashboard_path(assignee_id: current_user.id) .top-area = render 'shared/issuable/nav', type: :merge_requests .nav-controls = render 'shared/new_project_item_select', path: 'merge_requests/new', label: "New Merge Request" = render 'shared/issuable/filter', type: :merge_requests .prepend-top-default = render 'shared/merge_requests' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/0000755000175600017570000000000012672631600023121 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/lints/0000755000175600017570000000000012672631600024252 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/lints/_create.html.haml0000644000175600017570000000205112672631600027460 0ustar pravipravi- if @status %p %b Status: syntax is correct %i.fa.fa-ok.correct-syntax .table-holder %table.table.table-bordered %thead %tr %th Parameter %th Value %tbody - @stages.each do |stage| - @builds.select { |build| build[:stage] == stage }.each do |build| %tr %td #{stage.capitalize} Job - #{build[:name]} %td %pre = simple_format build[:commands] %br %b Tag list: = build[:tags] %br %b Refs only: = build[:only] && build[:only].join(", ") %br %b Refs except: = build[:except] && build[:except].join(", ") %br %b When: = build[:when] - if build[:allow_failure] %b Allowed to fail -else %p %b Status: syntax is incorrect %i.fa.fa-remove.incorrect-syntax %b Error: = @error gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/lints/show.html.haml0000644000175600017570000000101512672631600027035 0ustar pravipravi%h2 Check your .gitlab-ci.yml %hr .row = form_tag ci_lint_path, method: :post do .form-group = label_tag(:content, 'Content of .gitlab-ci.yml', class: 'control-label text-nowrap') .col-sm-12 = text_area_tag(:content, @content, class: 'form-control span1', rows: 7, require: true) .col-sm-12 .pull-left.prepend-top-10 = submit_tag('Validate', class: 'btn btn-success submit-yml') .row.prepend-top-20 .col-sm-12 .results = render partial: 'create' if defined?(@status) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/shared/0000755000175600017570000000000012672631600024367 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/shared/_no_runners.html.haml0000644000175600017570000000033512672631600030525 0ustar pravipravi.alert.alert-danger %p Now you need Runners to process your builds. %span Checkout the #{link_to 'GitLab Runner section', 'https://about.gitlab.com/gitlab-ci/#gitlab-runner', target: '_blank'} to install it gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/shared/_guide.html.haml0000644000175600017570000000112212672631600027425 0ustar pravipravi.bs-callout.help-callout %h4 How to setup CI for this project %ol %li Add at least one runner to the project. Go to #{link_to 'Runners page', runners_path(@project), target: :blank} for instructions. %li Put the .gitlab-ci.yml in the root of your repository. Examples can be found in #{link_to "Configuring project (.gitlab-ci.yml)", "http://doc.gitlab.com/ci/yaml/README.html", target: :blank}. You can also test your .gitlab-ci.yml in the #{link_to "Lint", ci_lint_path} %li Return to this page and refresh it, it should show a new build. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/projects/0000755000175600017570000000000012672631600024752 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/projects/index.html.haml0000644000175600017570000000076212672631600027674 0ustar pravipravi.wiki %h1 GitLab CI is now integrated in GitLab UI %h2 For existing projects %p Check the following pages to find the CI status you're looking for: %ul %li Projects page - shows CI status for each project. %li Project commits page - show CI status for each commit. %h2 For new projects %p If you want to enable CI for a new project it is easy as adding = link_to ".gitlab-ci.yml", "http://doc.gitlab.com/ce/ci/yaml/README.html" file to your repository gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/commits/0000755000175600017570000000000012672631600024574 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/commits/_commit.html.haml0000644000175600017570000000132712672631600030034 0ustar pravipravi%tr.build %td.status = ci_status_with_icon(commit.status) - if commit.running? · = commit.stage %td.build-link = link_to ci_status_path(commit) do %strong #{commit.short_sha} %td.build-message %span= truncate_first_line(commit.git_commit_message) %td.build-branch - unless @ref %span - commit.refs.each do |ref| = link_to truncate(ref, length: 25), ci_project_path(@project, ref: ref) %td.duration - if commit.duration > 0 #{time_interval_in_words commit.duration} %td.timestamp - if commit.finished_at %span #{time_ago_in_words commit.finished_at} ago - if commit.coverage %td.coverage #{commit.coverage}% gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/errors/0000755000175600017570000000000012672631600024435 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/ci/errors/show.haml0000644000175600017570000000003112672631600026252 0ustar pravipravi%h3.error Error = @error gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/0000755000175600017570000000000012672631600024040 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/gitlab/0000755000175600017570000000000012672631600025302 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/gitlab/status.html.haml0000644000175600017570000000312712672631600030436 0ustar pravipravi- page_title "GitLab.com import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-heart Import projects from GitLab.com %p.light Select projects you want to import. %hr %p = button_tag 'Import all projects', class: "btn btn-success js-import-all" .table-holder %table.table.import-jobs %thead %tr %th From GitLab.com %th To this GitLab instance %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = link_to project.import_source, "https://gitlab.com/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo["id"]}"} %td = link_to repo["path_with_namespace"], "https://gitlab.com/#{repo["path_with_namespace"]}", target: "_blank" %td.import-target = repo["path_with_namespace"] %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" :javascript new ImporterStatus("#{jobs_import_gitlab_path}", "#{import_gitlab_path}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/gitorious/0000755000175600017570000000000012672631600026064 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/gitorious/status.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/gitorious/status.html.ham0000644000175600017570000000310612672631600031041 0ustar pravipravi- page_title "Gitorious import" - header_title "Projects", root_path %h3.page-title %i.icon-gitorious.icon-gitorious-big Import projects from Gitorious.org %p.light Select projects you want to import. %hr %p = button_tag 'Import all projects', class: "btn btn-success js-import-all" .table-holder %table.table.import-jobs %thead %tr %th From Gitorious.org %th To GitLab %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = link_to project.import_source, "https://gitorious.org/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td = link_to repo.full_name, "https://gitorious.org/#{repo.full_name}", target: "_blank" %td.import-target = repo.full_name %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" :javascript new ImporterStatus("#{jobs_import_gitorious_path}", "#{import_gitorious_path}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/github/0000755000175600017570000000000012672631600025322 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/github/status.html.haml0000644000175600017570000000302412672631600030452 0ustar pravipravi- page_title "GitHub import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-github Import projects from GitHub %p.light Select projects you want to import. %hr %p = button_tag 'Import all projects', class: "btn btn-success js-import-all" .table-holder %table.table.import-jobs %thead %tr %th From GitHub %th To GitLab %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = link_to project.import_source, "https://github.com/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td = link_to repo.full_name, "https://github.com/#{repo.full_name}", target: "_blank" %td.import-target = repo.full_name %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" :javascript new ImporterStatus("#{jobs_import_github_path}", "#{import_github_path}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/base/0000755000175600017570000000000012672631600024752 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/base/create.js.haml0000644000175600017570000000273712672631600027504 0ustar pravipravi- if @already_been_taken :plain target_field = $("tr#repo_#{@repo_id} .import-target") origin_target = target_field.text() project_name = "#{@project_name}" origin_namespace = "#{@target_namespace}" target_field.empty() target_field.append("

This namespace already been taken! Please choose another one

") target_field.append("") target_field.append("/" + project_name) target_field.data("project_name", project_name) target_field.find('input').prop("value", origin_namespace) - elsif @access_denied :plain job = $("tr#repo_#{@repo_id}") job.find(".import-actions").html("

Access denied! Please verify you can add deploy keys to this repository.

") - elsif @project.persisted? :plain job = $("tr#repo_#{@repo_id}") job.attr("id", "project_#{@project.id}") target_field = job.find(".import-target") target_field.empty() target_field.append('#{link_to @project.path_with_namespace, namespace_project_path(@project.namespace, @project)}') $("table.import-jobs tbody").prepend(job) job.addClass("active").find(".import-actions").html(" started") - else :plain job = $("tr#repo_#{@repo_id}") job.find(".import-actions").html(" Error saving project: #{escape_javascript(@project.errors.full_messages.join(','))}") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/bitbucket/0000755000175600017570000000000012672631600026014 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/bitbucket/status.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/bitbucket/status.html.ham0000644000175600017570000000513412672631600030774 0ustar pravipravi- page_title "Bitbucket import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-bitbucket Import projects from Bitbucket - if @repos.any? %p.light Select projects you want to import. %hr %p - if @incompatible_repos.any? = button_tag 'Import all compatible projects', class: "btn btn-success js-import-all" - else = button_tag 'Import all projects', class: "btn btn-success js-import-all" .table-holder %table.table.import-jobs %thead %tr %th From Bitbucket %th To GitLab %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = link_to project.import_source, "https://bitbucket.org/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo["owner"]}___#{repo["slug"]}"} %td = link_to "#{repo["owner"]}/#{repo["slug"]}", "https://bitbucket.org/#{repo["owner"]}/#{repo["slug"]}", target: "_blank" %td.import-target = "#{repo["owner"]}/#{repo["slug"]}" %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" - @incompatible_repos.each do |repo| %tr{id: "repo_#{repo["owner"]}___#{repo["slug"]}"} %td = link_to "#{repo["owner"]}/#{repo["slug"]}", "https://bitbucket.org/#{repo["owner"]}/#{repo["slug"]}", target: "_blank" %td.import-target %td.import-actions-job-status = label_tag "Incompatible Project", nil, class: "label label-danger" - if @incompatible_repos.any? %p One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git. Please convert = link_to "them to Git,", "https://www.atlassian.com/git/tutorials/migrating-overview" and go through the = link_to "import flow", status_import_bitbucket_path, "data-no-turbolink" => "true" again. :javascript new ImporterStatus("#{jobs_import_bitbucket_path}", "#{import_bitbucket_path}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/0000755000175600017570000000000012672631600026306 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/new.html.haml0000644000175600017570000000425012672631600030706 0ustar pravipravi- page_title "Google Code import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-google Import projects from Google Code %hr = form_tag callback_import_google_code_path, class: 'form-horizontal', multipart: true do %p Follow the steps below to export your Google Code project data. In the next step, you'll be able to select the projects you want to import. %ol %li %p Go to #{link_to "Google Takeout", "https://www.google.com/settings/takeout", target: "_blank"}. %li %p Make sure you're logged into the account that owns the projects you'd like to import. %li %p Click the Select none button on the right, since we only need "Google Code Project Hosting". %li %p Scroll down to Google Code Project Hosting and enable the switch on the right. %li %p Choose Next at the bottom of the page. %li %p Leave the "File type" and "Delivery method" options on their default values. %li %p Choose Create archive and wait for archiving to complete. %li %p Click the Download button and wait for downloading to complete. %li %p Find the downloaded ZIP file and decompress it. %li %p Find the newly extracted Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json file. %li %p Upload GoogleCodeProjectHosting.json here: %p %input{type: "file", name: "dump_file", id: "dump_file"} %li %p Do you want to customize how Google Code email addresses and usernames are imported into GitLab? %p = label_tag :create_user_map_0 do = radio_button_tag :create_user_map, 0, true No, directly import the existing email addresses and usernames. %p = label_tag :create_user_map_1 do = radio_button_tag :create_user_map, 1, false Yes, let me map Google Code users to full names or GitLab users. %li %p = submit_tag 'Continue to the next step', class: "btn btn-create" ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/status.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/status.html.h0000644000175600017570000000507212672631600030751 0ustar pravipravi- page_title "Google Code import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-google Import projects from Google Code - if @repos.any? %p.light Select projects you want to import. %p.light Optionally, you can = link_to "customize", new_user_map_import_google_code_path how Google Code email addresses and usernames are imported into GitLab. %hr %p - if @incompatible_repos.any? = button_tag 'Import all compatible projects', class: "btn btn-success js-import-all" - else = button_tag 'Import all projects', class: "btn btn-success js-import-all" .table-holder %table.table.import-jobs %thead %tr %th From Google Code %th To GitLab %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = link_to project.import_source, "https://code.google.com/p/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank" %td.import-target = "#{current_user.username}/#{repo.name}" %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" - @incompatible_repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank" %td.import-target %td.import-actions-job-status = label_tag "Incompatible Project", nil, class: "label label-danger" - if @incompatible_repos.any? %p One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git. Please convert them to Git on Google Code, and go through the = link_to "import flow", new_import_google_code_path again. :javascript new ImporterStatus("#{jobs_import_google_code_path}", "#{import_google_code_path}"); ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/new_user_map.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/google_code/new_user_map.0000644000175600017570000000456512672631600031005 0ustar pravipravi- page_title "User map", "Google Code import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-google Import projects from Google Code %hr = form_tag create_user_map_import_google_code_path, class: 'form-horizontal' do %p Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import. %p The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of :. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side. %ul %li %strong Default: Directly import the Google Code email address or username %p "johnsmith@example.com": "johnsm...@example.com" will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy. %li %strong Map a Google Code user to a GitLab user %p "johnsmith@example.com": "@johnsmith" will add "By @johnsmith" to all issues and comments originally created by johnsmith@example.com, and will set @johnsmith as the assignee on all issues originally assigned to johnsmith@example.com. %li %strong Map a Google Code user to a full name %p "johnsmith@example.com": "John Smith" will add "By John Smith" to all issues and comments originally created by johnsmith@example.com. %li %strong Map a Google Code user to a full email address %p "johnsmith@example.com": "johnsmith@example.com" will add "By johnsmith@example.com" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address. .form-group .col-sm-12 = text_area_tag :user_map, JSON.pretty_generate(@user_map), class: 'form-control', rows: 15 .form-actions = submit_tag 'Continue to the next step', class: "btn btn-create" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/fogbugz/0000755000175600017570000000000012672631600025503 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/fogbugz/new.html.haml0000644000175600017570000000171212672631600030103 0ustar pravipravi- page_title "FogBugz Import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-bug Import projects from FogBugz %hr = form_tag callback_import_fogbugz_path, class: 'form-horizontal' do %p To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import. .form-group = label_tag :uri, 'FogBugz URL', class: 'control-label' .col-sm-4 = text_field_tag :uri, nil, placeholder: 'https://mycompany.fogbugz.com', class: 'form-control' .form-group = label_tag :email, 'FogBugz Email', class: 'control-label' .col-sm-4 = text_field_tag :email, nil, class: 'form-control' .form-group = label_tag :password, 'FogBugz Password', class: 'control-label' .col-sm-4 = password_field_tag :password, nil, class: 'form-control' .form-actions = submit_tag 'Continue to the next step', class: 'btn btn-create' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/fogbugz/status.html.haml0000644000175600017570000000313712672631600030640 0ustar pravipravi- page_title "FogBugz import" - header_title "Projects", root_path %h3.page-title %i.fa.fa-bug Import projects from FogBugz - if @repos.any? %p.light Select projects you want to import. %p.light Optionally, you can = link_to 'customize', new_user_map_import_fogbugz_path how FogBugz email addresses and usernames are imported into GitLab. %hr %p = button_tag 'Import all projects', class: 'btn btn-success js-import-all' .table-holder %table.table.import-jobs %thead %tr %th From FogBugz %th To GitLab %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td = project.import_source %td %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span %i.fa.fa-check done - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td = repo.name %td.import-target = "#{current_user.username}/#{repo.name}" %td.import-actions.job-status = button_tag "Import", class: "btn js-add-to-import" :javascript new ImporterStatus("#{jobs_import_fogbugz_path}", "#{import_fogbugz_path}"); ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/fogbugz/new_user_map.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/import/fogbugz/new_user_map.html0000644000175600017570000000370112672631600031056 0ustar pravipravi- page_title 'User map', 'FogBugz import' - header_title "Projects", root_path %h3.page-title %i.fa.fa-bug Import projects from FogBugz %hr = form_tag create_user_map_import_fogbugz_path, class: 'form-horizontal' do %p Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import. %p The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames wil be imported into GitLab. You can change this by populating the table below. %ul %li %strong Default: Map a FogBugz account ID to a full name %p An empty GitLab User field will add the FogBugz user's full name (e.g. "By John Smith") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator. %li %strong Map a FogBugz account ID to a GitLab user %p Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. "By @johnsmith"). It will also associate and/or assign these issues and comments with the selected user. .table-holder %table.table %thead %tr %th ID %th Name %th Email %th GitLab User %tbody - @user_map.each do |id, user| %tr %td= id %td= text_field_tag "users[#{id}][name]", user[:name], class: 'form-control' %td= text_field_tag "users[#{id}][email]", user[:email], class: 'form-control' %td = users_select_tag("users[#{id}][gitlab_user]", class: 'custom-form-control', scope: :all, email_user: true, selected: user[:gitlab_user]) .form-actions = submit_tag 'Continue to the next step', class: 'btn btn-create' :javascript new UsersSelect(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/email_rejection_mailer/0000755000175600017570000000000012672631600027210 5ustar pravipravi././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/email_rejection_mailer/rejection.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/email_rejection_mailer/rejection0000644000175600017570000000013512672631600031114 0ustar pravipravi%p Unfortunately, your email message to GitLab could not be processed. = markdown @reason ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/email_rejection_mailer/rejection.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/email_rejection_mailer/rejection0000644000175600017570000000012012672631600031106 0ustar pravipraviUnfortunately, your email message to GitLab could not be processed. = @reason gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/0000755000175600017570000000000012672631600024357 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/show.atom.builder0000644000175600017570000000120012672631600027637 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@project.name} activity" xml.link href: namespace_project_url(@project.namespace, @project, format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: namespace_project_url(@project.namespace, @project), rel: "alternate", type: "text/html" xml.id namespace_project_url(@project.namespace, @project) xml.updated @events[0].updated_at.xmlschema if @events[0] @events.each do |event| event_to_atom(xml, event) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_activity.html.haml0000644000175600017570000000061312672631600030160 0ustar pravipravi.nav-block.activity-filter-block - if current_user .controls = link_to namespace_project_path(@project.namespace, @project, format: :atom, private_token: current_user.private_token), title: "Feed", class: 'btn rss-btn' do %i.fa.fa-rss = render 'shared/event_filter' .content_list{:"data-href" => activity_project_path(@project)} = spinner :javascript new Activities(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/network/0000755000175600017570000000000012672631600026050 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/network/_head.html.haml0000644000175600017570000000032012672631600030711 0ustar pravipravi.gray-content-block.append-bottom-default .tree-ref-holder = render partial: 'shared/ref_switcher', locals: {destination: 'graph'} .oneline You can move around the graph by using the arrow keys. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/network/show.json.erb0000644000175600017570000000111112672631600030464 0ustar pravipravi<% self.formats = ["html"] %> <%= raw( { days: @graph.days.compact.map { |d| [d.day, d.strftime("%b")] }, commits: @graph.commits.map do |c| { parents: parents_zip_spaces(c.parents(@graph.map), c.parent_spaces), author: { name: c.author_name, email: c.author_email, icon: image_path(avatar_icon(c.author_email, 20)) }, time: c.time, space: c.spaces.first, refs: get_refs(@graph.repo, c), id: c.sha, date: c.date, message: c.message, } end }.to_json ) %> gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/network/show.html.haml0000644000175600017570000000201612672631600030635 0ustar pravipravi- page_title "Network", @ref = render "projects/commits/header_title" = render "projects/commits/head" = render "head" .project-network .controls = form_tag namespace_project_network_path(@project.namespace, @project, @id), method: :get, class: 'form-inline network-form' do |f| = text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: "Input an extended SHA1 syntax", class: 'search-input form-control input-mx-250 search-sha' = button_tag class: 'btn btn-success' do = icon('search') .inline.prepend-left-20 .checkbox.light = label_tag :filter_ref do = check_box_tag :filter_ref, 1, @options[:filter_ref] %span Begin with the selected commit .network-graph = spinner nil, true :javascript network_graph = new Network({ url: "#{escape_javascript(@url)}", commit_url: "#{escape_javascript(@commit_url)}", ref: "#{escape_javascript(@ref)}", commit_id: '#{@commit.id}' }) new ShortcutsNetwork(network_graph.branch_graph) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/0000755000175600017570000000000012672631600026053 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/edit.html.haml0000644000175600017570000000177412672631600030617 0ustar pravipravi- page_title "Edit", "#{@runner.description} ##{@runner.id}", "Runners" %h4 Runner ##{@runner.id} %hr = form_for @runner, url: runner_path(@runner), html: { class: 'form-horizontal' } do |f| .form-group = label :active, "Active", class: 'control-label' .col-sm-10 .checkbox = f.check_box :active %span.light Paused runners don't accept new builds .form-group = label_tag :token, class: 'control-label' do Token .col-sm-10 = f.text_field :token, class: 'form-control', readonly: true .form-group = label_tag :description, class: 'control-label' do Description .col-sm-10 = f.text_field :description, class: 'form-control' .form-group = label_tag :tag_list, class: 'control-label' do Tags .col-sm-10 = f.text_field :tag_list, value: @runner.tag_list.to_s, class: 'form-control' .help-block You can setup jobs to only use runners with specific tags .form-actions = f.submit 'Save changes', class: 'btn btn-save' ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_shared_runners.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_shared_runners0000644000175600017570000000217212672631600031161 0ustar pravipravi%h3 Shared runners .bs-callout.bs-callout-warning GitLab Runners do not offer secure isolation between projects that they do builds for. You are TRUSTING all GitLab users who can push code to project A, B or C to run shell scripts on the machine hosting runner X. %hr - if @project.shared_runners_enabled? = link_to toggle_shared_runners_namespace_project_runners_path(@project.namespace, @project), class: 'btn btn-warning', method: :post do Disable shared runners - else = link_to toggle_shared_runners_namespace_project_runners_path(@project.namespace, @project), class: 'btn btn-success', method: :post do Enable shared runners   for this project - if @shared_runners_count.zero? This GitLab server does not provide any shared runners yet. Please use specific runners or ask the administrator to create one. - else %h4.underlined-title Available shared runners - #{@shared_runners_count} %ul.bordered-list.available-shared-runners = render partial: 'runner', collection: @shared_runners, as: :runner - if @shared_runners_count > 10 .light and #{@shared_runners_count - 10} more... gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/index.html.haml0000644000175600017570000000135312672631600030772 0ustar pravipravi- page_title "Runners" .light.prepend-top-default %p A 'runner' is a process which runs a build. You can setup as many runners as you need. %br Runners can be placed on separate users, servers, and even on your local machine. %p Each runner can be in one of the following states: %div %ul %li %span.label.label-success active \- runner is active and can process any new build %li %span.label.label-danger paused \- runner is paused and will not receive any new build %hr %p.lead To start serving your builds you can either add specific runners to your project or use shared runners .row .col-sm-6 = render 'specific_runners' .col-sm-6 = render 'shared_runners' ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_specific_runners.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_specific_runne0000644000175600017570000000166112672631600031135 0ustar pravipravi%h3 Specific runners .bs-callout.help-callout %h4 How to setup a new project specific runner %ol %li Install GitLab Runner software. Checkout the #{link_to 'GitLab Runner section', 'https://about.gitlab.com/gitlab-ci/#gitlab-runner', target: '_blank'} to install it %li Specify following URL during runner setup: %code #{ci_root_url(only_path: false)} %li Use the following registration token during setup: %code #{@project.runners_token} %li Start runner! - if @runners.any? %h4.underlined-title Runners activated for this project %ul.bordered-list.activated-specific-runners = render partial: 'runner', collection: @runners, as: :runner - if @specific_runners.any? %h4.underlined-title Available specific runners %ul.bordered-list.available-specific-runners = render partial: 'runner', collection: @specific_runners, as: :runner = paginate @specific_runners ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_runner.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/_runner.html.ha0000644000175600017570000000264412672631600031006 0ustar pravipravi%li.runner{id: dom_id(runner)} %h4 = runner_status_icon(runner) %span.monospace - if @runners.include?(runner) = link_to runner.short_sha, runner_path(runner) %small =link_to edit_namespace_project_runner_path(@project.namespace, @project, runner) do %i.fa.fa-edit.btn - else = runner.short_sha .pull-right - if @runners.include?(runner) - if runner.belongs_to_one_project? = link_to 'Remove runner', runner_path(runner), data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' - else - runner_project = @project.runner_projects.find_by(runner_id: runner) = link_to 'Disable for this project', namespace_project_runner_project_path(@project.namespace, @project, runner_project), data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' - elsif runner.specific? = form_for [@project.namespace.becomes(Namespace), @project, @project.runner_projects.new] do |f| = f.hidden_field :runner_id, value: runner.id = f.submit 'Enable for this project', class: 'btn btn-sm' .pull-right %small.light \##{runner.id} - if runner.description.present? %p.runner-description = runner.description - if runner.tag_list.present? %p - runner.tag_list.each do |tag| %span.label.label-primary = tag gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/runners/show.html.haml0000644000175600017570000000214712672631600030645 0ustar pravipravi- page_title "#{@runner.description} ##{@runner.id}", "Runners" %h3.page-title Runner ##{@runner.id} .pull-right - if @runner.shared? %span.runner-state.runner-state-shared Shared - else %span.runner-state.runner-state-specific Specific .table-holder %table.table %thead %tr %th Property Name %th Value %tr %td Tags %td - @runner.tag_list.each do |tag| %span.label.label-primary = tag %tr %td Name %td = @runner.name %tr %td Version %td = @runner.version %tr %td Revision %td = @runner.revision %tr %td Platform %td = @runner.platform %tr %td Architecture %td = @runner.architecture %tr %td Description %td = @runner.description %tr %td Last contact %td - if @runner.contacted_at #{time_ago_in_words(@runner.contacted_at)} ago - else Never gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit_statuses/0000755000175600017570000000000012672631600027602 5ustar pravipravi././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit_statuses/_commit_status.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit_statuses/_commit0000644000175600017570000000542712672631600031164 0ustar pravipravi%tr.commit_status %td.status - if can?(current_user, :read_commit_status, commit_status) && commit_status.target_url = link_to commit_status.target_url, class: "ci-status ci-#{commit_status.status}" do = ci_icon_for_status(commit_status.status) = commit_status.status - else = ci_status_with_icon(commit_status.status) %td.commit_status-link - if can?(current_user, :read_commit_status, commit_status) && commit_status.target_url = link_to commit_status.target_url do %strong ##{commit_status.id} - else %strong ##{commit_status.id} - if commit_status.show_warning? %i.fa.fa-warning.text-warning{data: { toggle: "tooltip" }, title: "This build is stuck, open it to know more"} - if defined?(commit_sha) && commit_sha %td = link_to commit_status.short_sha, namespace_project_commit_path(commit_status.project.namespace, commit_status.project, commit_status.sha), class: "monospace" %td - if commit_status.ref = link_to commit_status.ref, namespace_project_commits_path(commit_status.project.namespace, commit_status.project, commit_status.ref) - else .light none - if defined?(runner) && runner %td - if commit_status.try(:runner) = runner_link(commit_status.runner) - else .light none - if defined?(stage) && stage %td = commit_status.stage %td = commit_status.name .pull-right - if commit_status.tags.any? - commit_status.tags.each do |tag| %span.label.label-primary = tag - if commit_status.try(:trigger_request) %span.label.label-info triggered - if commit_status.try(:allow_failure) %span.label.label-danger allowed to fail %td.duration - if commit_status.duration #{duration_in_words(commit_status.finished_at, commit_status.started_at)} %td.timestamp - if commit_status.finished_at %span #{time_ago_with_tooltip(commit_status.finished_at)} - if defined?(coverage) && coverage %td.coverage - if commit_status.try(:coverage) #{commit_status.coverage}% %td .pull-right - if can?(current_user, :read_commit_status, commit_status) && commit_status.artifacts_download_url = link_to commit_status.artifacts_download_url, title: 'Download artifacts' do %i.fa.fa-download - if can?(current_user, :update_commit_status, commit_status) - if commit_status.active? - if commit_status.cancel_url = link_to commit_status.cancel_url, method: :post, title: 'Cancel' do %i.fa.fa-remove.cred - elsif defined?(allow_retry) && allow_retry && commit_status.retry_url = link_to commit_status.retry_url, method: :post, title: 'Retry' do %i.fa.fa-repeat ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_gitlab_import_modal.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_gitlab_import_modal.ht0000644000175600017570000000075612672631600031073 0ustar pravipravi%div#gitlab_import_modal.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from GitLab.com .modal-body To enable importing projects from GitLab.com, - if current_user.admin? as administrator you need to configure - else ask your GitLab administrator to configure == #{link_to 'OAuth integration', help_page_path("integration", "gitlab")}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/hooks/0000755000175600017570000000000012672631600025502 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/hooks/index.html.haml0000644000175600017570000000723112672631600030422 0ustar pravipravi- page_title "Web Hooks" %h3.page-title Web hooks %p.light #{link_to "Web hooks ", help_page_path("web_hooks", "web_hooks"), class: "vlink"} can be used for binding events when something is happening within the project. %hr.clearfix = form_for [@project.namespace.becomes(Namespace), @project, @hook], as: :hook, url: namespace_project_hooks_path(@project.namespace, @project), html: { class: 'form-horizontal' } do |f| -if @hook.errors.any? .alert.alert-danger - @hook.errors.full_messages.each do |msg| %p= msg .form-group = f.label :url, "URL", class: 'control-label' .col-sm-10 = f.text_field :url, class: "form-control", placeholder: 'http://example.com/trigger-ci.json' .form-group = f.label :url, "Trigger", class: 'control-label' .col-sm-10.prepend-top-10 %div = f.check_box :push_events, class: 'pull-left' .prepend-left-20 = f.label :push_events, class: 'list-label' do %strong Push events %p.light This url will be triggered by a push to the repository %div = f.check_box :tag_push_events, class: 'pull-left' .prepend-left-20 = f.label :tag_push_events, class: 'list-label' do %strong Tag push events %p.light This url will be triggered when a new tag is pushed to the repository %div = f.check_box :note_events, class: 'pull-left' .prepend-left-20 = f.label :note_events, class: 'list-label' do %strong Comments %p.light This url will be triggered when someone adds a comment %div = f.check_box :issues_events, class: 'pull-left' .prepend-left-20 = f.label :issues_events, class: 'list-label' do %strong Issues events %p.light This url will be triggered when an issue is created/updated/merged %div = f.check_box :merge_requests_events, class: 'pull-left' .prepend-left-20 = f.label :merge_requests_events, class: 'list-label' do %strong Merge Request events %p.light This url will be triggered when a merge request is created/updated/merged %div = f.check_box :build_events, class: 'pull-left' .prepend-left-20 = f.label :build_events, class: 'list-label' do %strong Build events %p.light This url will be triggered when the build status changes .form-group = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox' .col-sm-10 .checkbox = f.label :enable_ssl_verification do = f.check_box :enable_ssl_verification %strong Enable SSL verification .form-actions = f.submit "Add Web Hook", class: "btn btn-create" -if @hooks.any? .panel.panel-default .panel-heading Web hooks (#{@hooks.count}) %ul.well-list - @hooks.each do |hook| %li .pull-right = link_to 'Test Hook', test_namespace_project_hook_path(@project.namespace, @project, hook), class: "btn btn-sm btn-grouped" = link_to 'Remove', namespace_project_hook_path(@project.namespace, @project, hook), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove btn-sm btn-grouped" .clearfix %span.monospace= hook.url %p - %w(push_events tag_push_events issues_events note_events merge_requests_events build_events).each do |trigger| - if hook.send(trigger) %span.label.label-gray= trigger.titleize SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_md_preview.html.haml0000644000175600017570000000126212672631600030466 0ustar pravipravi.md-area .md-header.clearfix %ul.nav-links %li.active %a.js-md-write-button(href="#md-write-holder" tabindex="-1") Write %li %a.js-md-preview-button(href="#md-preview-holder" tabindex="-1") Preview %div .md-write-holder = yield .md.md-preview-holder.hide .js-md-preview{class: (preview_class if defined?(preview_class))} - if defined?(referenced_users) && referenced_users %div.referenced-users.hide %span = icon('exclamation-triangle') You are about to add %strong %span.js-referenced-users-count 0 people to the discussion. Proceed with caution. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/edit.html.haml0000644000175600017570000003436512672631600027125 0ustar pravipravi.project-edit-container.prepend-top-default .project-edit-errors .project-edit-content .panel.panel-default .panel-heading Project settings .panel-body = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal fieldset-form" }, authenticity_token: true do |f| %fieldset .form-group.project_name_holder = f.label :name, class: 'control-label' do Project name .col-sm-10 = f.text_field :name, class: "form-control", id: "project_name_edit" .form-group = f.label :description, class: 'control-label' do Project description %span.light (optional) .col-sm-10 = f.text_area :description, class: "form-control", rows: 3, maxlength: 250 - unless @project.empty_repo? .form-group = f.label :default_branch, "Default Branch", class: 'control-label' .col-sm-10= f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide'}) = render 'shared/visibility_level', f: f, visibility_level: @project.visibility_level, can_change_visibility_level: can_change_visibility_level?(@project, current_user), form_model: @project .form-group = f.label :tag_list, "Tags", class: 'control-label' .col-sm-10 = f.text_field :tag_list, value: @project.tag_list.to_s, maxlength: 2000, class: "form-control" %p.help-block Separate tags with commas. %fieldset.features %legend Features: .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :issues_enabled do = f.check_box :issues_enabled %strong Issues %br %span.descr Lightweight issue tracking system for this project .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :merge_requests_enabled do = f.check_box :merge_requests_enabled %strong Merge Requests %br %span.descr Submit changes to be merged upstream .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :builds_enabled do = f.check_box :builds_enabled %strong Builds %br %span.descr Test and deploy your changes before merge .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :wiki_enabled do = f.check_box :wiki_enabled %strong Wiki %br %span.descr Pages for project documentation .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :snippets_enabled do = f.check_box :snippets_enabled %strong Snippets %br %span.descr Share code pastes with others out of git repository %fieldset.features %legend Project avatar: .form-group .col-sm-offset-2.col-sm-10 - if @project.avatar? = project_icon("#{@project.namespace.to_param}/#{@project.to_param}", alt: '', class: 'avatar project-avatar s160') %p.light - if @project.avatar_in_git Project avatar in repository: #{ @project.avatar_in_git } %p.light - if @project.avatar? You can change your project avatar here - else You can upload a project avatar here %a.choose-btn.btn.btn-sm.js-choose-project-avatar-button %i.icon-paper-clip %span Choose File ...   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: "js-project-avatar-input hidden" .light The maximum file size allowed is 200KB. - if @project.avatar? %hr = link_to 'Remove avatar', namespace_project_avatar_path(@project.namespace, @project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" %fieldset.features %legend Continuous Integration .form-group .col-sm-offset-2.col-sm-10 %p Get recent application code using the following command: .radio = f.label :build_allow_git_fetch_false do = f.radio_button :build_allow_git_fetch, 'false' %strong git clone %br %span.descr Slower but makes sure you have a clean dir before every build .radio = f.label :build_allow_git_fetch_true do = f.radio_button :build_allow_git_fetch, 'true' %strong git fetch %br %span.descr Faster .form-group = f.label :build_timeout_in_minutes, 'Timeout', class: 'control-label' .col-sm-10 = f.number_field :build_timeout_in_minutes, class: 'form-control', min: '0' %p.help-block per build in minutes .form-group = f.label :build_coverage_regex, "Test coverage parsing", class: 'control-label' .col-sm-10 .input-group %span.input-group-addon / = f.text_field :build_coverage_regex, class: 'form-control', placeholder: '\(\d+.\d+\%\) covered' %span.input-group-addon / %p.help-block We will use this regular expression to find test coverage output in build trace. Leave blank if you want to disable this feature .bs-callout.bs-callout-info %p Below are examples of regex for existing tools: %ul %li Simplecov (Ruby) - %code \(\d+.\d+\%\) covered %li pytest-cov (Python) - %code \d+\%\s*$ %li phpunit --coverage-text --colors=never (PHP) - %code ^\s*Lines:\s*\d+.\d+\% .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :public_builds do = f.check_box :public_builds %strong Public builds .help-block Allow everyone to access builds for Public and Internal projects %fieldset.features %legend Advanced settings .form-group = f.label :runners_token, "CI token", class: 'control-label' .col-sm-10 = f.text_field :runners_token, class: "form-control", placeholder: 'xEeFCaDAB89' %p.help-block The secure token used to checkout project. .form-actions = f.submit 'Save changes', class: "btn btn-save" .danger-settings .panel.panel-default .panel-heading Housekeeping .errors-holder .panel-body %p Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects. %br .form-actions = link_to 'Housekeeping', housekeeping_namespace_project_path(@project.namespace, @project), method: :post, class: "btn btn-default" - if can? current_user, :archive_project, @project - if @project.archived? .panel.panel-success .panel-heading Unarchive project .panel-body %p Unarchiving the project will mark its repository as active. %br The project can be committed to. %br %strong Once active this project shows up in the search and on the dashboard. .form-actions = link_to 'Unarchive project', unarchive_namespace_project_path(@project.namespace, @project), data: { confirm: "Are you sure that you want to unarchive this project?\nWhen this project is unarchived it is active and can be committed to again." }, method: :post, class: "btn btn-success" - else .panel.panel-warning .panel-heading Archive project .panel-body %p Archiving the project will mark its repository as read-only. %br It is hidden from the dashboard and doesn't show up in searches. %br %strong Archived projects cannot be committed to! .form-actions = link_to 'Archive project', archive_namespace_project_path(@project.namespace, @project), data: { confirm: "Are you sure that you want to archive this project?\nAn archived project cannot be committed to." }, method: :post, class: "btn btn-warning" - else .nothing-here-block Only the project owner can archive a project .panel.panel-default.panel.panel-warning .panel-heading Rename repository .errors-holder .panel-body = form_for([@project.namespace.becomes(Namespace), @project], html: { class: 'form-horizontal' }) do |f| .form-group.project_name_holder = f.label :name, class: 'control-label' do Project name .col-sm-9 .form-group = f.text_field :name, class: "form-control" .form-group = f.label :path, class: 'control-label' do %span Path .col-sm-9 .form-group .input-group .input-group-addon #{URI.join(root_url, @project.namespace.path)}/ = f.text_field :path, class: 'form-control' %ul %li Be careful. Renaming a project's repository can have unintended side effects. %li You will need to update your local repositories to point to the new location. .form-actions = f.submit 'Rename project', class: "btn btn-warning" - if can?(current_user, :change_namespace, @project) .panel.panel-default.panel.panel-danger .panel-heading Transfer project .errors-holder .panel-body = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_namespace_project_path(@project.namespace, @project), method: :put, remote: true, html: { class: 'transfer-project form-horizontal' }) do |f| .form-group = label_tag :new_namespace_id, nil, class: 'control-label' do %span Namespace .col-sm-9 .form-group = select_tag :new_namespace_id, namespaces_options(@project.namespace_id), { prompt: 'Choose a project namespace', class: 'select2' } %ul %li Be careful. Changing the project's namespace can have unintended side effects. %li You can only transfer the project to namespaces you manage. %li You will need to update your local repositories to point to the new location. .form-actions = f.submit 'Transfer project', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => transfer_project_message(@project) } - else .nothing-here-block Only the project owner can transfer a project - if @project.forked? - if can?(current_user, :remove_fork_project, @project) = form_for([@project.namespace.becomes(Namespace), @project], url: remove_fork_namespace_project_path(@project.namespace, @project), method: :delete, remote: true, html: { class: 'transfer-project form-horizontal' }) do |f| .panel.panel-default.panel.panel-danger .panel-heading Remove fork relationship .panel-body %p This will remove the fork relationship to source project #{link_to @project.forked_from_project.name_with_namespace, project_path(@project.forked_from_project)}. %br %strong Once removed, the fork relationship cannot be restored and you will no longer be able to send merge requests to the source. .form-actions = button_to 'Remove fork relationship', '#', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => remove_fork_project_message(@project) } - else .nothing-here-block Only the project owner can remove the fork relationship. - if can?(current_user, :remove_project, @project) .panel.panel-default.panel.panel-danger .panel-heading Remove project .panel-body = form_tag(namespace_project_path(@project.namespace, @project), method: :delete, class: 'form-horizontal') do %p Removing the project will delete its repository and all related resources including issues, merge requests etc. %br %strong Removed projects cannot be restored! .form-actions = button_to 'Remove project', '#', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => remove_project_message(@project) } - else .nothing-here-block Only the project owner can remove a project. .save-project-loader.hide .center %h2 %i.fa.fa-spinner.fa-spin Saving project. %p Please wait a moment, this page will automatically refresh when ready. = render 'shared/confirm_modal', phrase: @project.path gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/new.html.haml0000644000175600017570000001134312672631600026760 0ustar pravipravi- page_title 'New Project' - header_title "Projects", root_path %h3.page-title New Project %hr .project-edit-container .project-edit-errors = render 'projects/errors' .project-edit-content = form_for @project, html: { class: 'new_project form-horizontal js-requires-input' } do |f| .form-group.project-name-holder = f.label :path, class: 'control-label' do Project path .col-sm-10 .input-group - if current_user.can_select_namespace? .input-group-addon = root_url = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user, display_path: true), {}, {class: 'select2', tabindex: 1} .input-group-addon \/ - else .input-group-addon #{root_url}#{current_user.username}/ = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 2, autofocus: true, required: true - if current_user.can_create_group? .help-block Want to house several dependent projects under the same namespace? = link_to "Create a group", new_group_path - if import_sources_enabled? .project-import.js-toggle-container .form-group %label.control-label Import project from .col-sm-10 - if github_import_enabled? - if github_import_configured? = link_to status_import_github_path, class: 'btn import_github' do %i.fa.fa-github GitHub - else = link_to '#', class: 'how_to_import_link btn import_github' do %i.fa.fa-github GitHub = render 'github_import_modal' - if bitbucket_import_enabled? - if bitbucket_import_configured? = link_to status_import_bitbucket_path, class: 'btn import_bitbucket', "data-no-turbolink" => "true" do %i.fa.fa-bitbucket Bitbucket - else = link_to status_import_bitbucket_path, class: 'how_to_import_link btn import_bitbucket', "data-no-turbolink" => "true" do %i.fa.fa-bitbucket Bitbucket = render 'bitbucket_import_modal' - if gitlab_import_enabled? - if gitlab_import_configured? = link_to status_import_gitlab_path, class: 'btn import_gitlab' do %i.fa.fa-heart GitLab.com - else = link_to status_import_gitlab_path, class: 'how_to_import_link btn import_gitlab' do %i.fa.fa-heart GitLab.com = render 'gitlab_import_modal' - if gitorious_import_enabled? = link_to new_import_gitorious_path, class: 'btn import_gitorious' do %i.icon-gitorious.icon-gitorious-small Gitorious.org - if google_code_import_enabled? = link_to new_import_google_code_path, class: 'btn import_google_code' do %i.fa.fa-google Google Code - if fogbugz_import_enabled? = link_to new_import_fogbugz_path, class: 'btn import_fogbugz' do %i.fa.fa-bug Fogbugz - if git_import_enabled? = link_to "#", class: 'btn js-toggle-button import_git' do %i.fa.fa-git %span Any repo by URL .js-toggle-content.hide = render "shared/import_form", f: f .prepend-botton-10 .form-group = f.label :description, class: 'control-label' do Description %span.light (optional) .col-sm-10 = f.text_area :description, class: "form-control", rows: 3, maxlength: 250, tabindex: 3 = render 'shared/visibility_level', f: f, visibility_level: default_project_visibility, can_change_visibility_level: true, form_model: @project .form-actions = f.submit 'Create project', class: "btn btn-create project-submit", tabindex: 4 = link_to 'Cancel', dashboard_projects_path, class: 'btn btn-cancel' .save-project-loader.hide .center %h2 %i.fa.fa-spinner.fa-spin Creating project & repository. %p Please wait a moment, this page will automatically refresh when ready. :javascript $('.how_to_import_link').bind('click', function (e) { e.preventDefault(); var import_modal = $(this).next(".modal").show(); }); $('.modal-header .close').bind('click', function() { $(".modal").hide(); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/0000755000175600017570000000000012672631600025315 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/new.html.haml0000644000175600017570000000361312672631600027717 0ustar pravipravi- page_title "New Tag" = render "projects/commits/header_title" - if @error .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × = @error %h3.page-title New Tag %hr = form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal gfm-form tag-form js-requires-input" do .form-group = label_tag :tag_name, nil, class: 'control-label' .col-sm-10 = text_field_tag :tag_name, params[:tag_name], required: true, tabindex: 1, autofocus: true, class: 'form-control' .form-group = label_tag :ref, 'Create from', class: 'control-label' .col-sm-10 = text_field_tag :ref, params[:ref] || @project.default_branch, required: true, tabindex: 2, class: 'form-control' .help-block Branch name or commit SHA .form-group = label_tag :message, nil, class: 'control-label' .col-sm-10 = text_field_tag :message, nil, required: false, tabindex: 3, class: 'form-control' .help-block Optionally, enter a message to create an annotated tag. %hr .form-group = label_tag :release_description, 'Release notes', class: 'control-label' .col-sm-10 = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', attr: :release_description, classes: 'description js-quick-submit form-control' = render 'projects/notes/hints' .help-block Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page. .form-actions = button_tag 'Create tag', class: 'btn btn-create', tabindex: 3 = link_to 'Cancel', namespace_project_tags_path(@project.namespace, @project), class: 'btn btn-cancel' :javascript var availableRefs = #{@project.repository.ref_names.to_json}; $("#ref").autocomplete({ source: availableRefs, minLength: 1 }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/destroy.js.haml0000644000175600017570000000024512672631600030265 0ustar pravipravi$('.js-totaltags-count').html("#{@repository.tags.size}"); - if @repository.tags.empty? $('.tags').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/index.html.haml0000644000175600017570000000144512672631600030236 0ustar pravipravi- page_title "Tags" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block - if can? current_user, :push_code, @project .pull-right = link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do = icon('plus') New tag .oneline Tags give the ability to mark specific points in history as being important .tags - unless @tags.empty? %ul.content-list - @tags.each do |tag| = render 'tag', tag: @repository.find_tag(tag) = paginate @tags, theme: 'gitlab' - else .nothing-here-block Repository has no tags yet. %br %small Use git tag command to add a new one: %br %span.monospace git tag -a v1.4 -m 'version 1.4' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/_tag.html.haml0000644000175600017570000000264712672631600030046 0ustar pravipravi- commit = @repository.commit(tag.target) - release = @releases.find { |release| release.tag == tag.name } %li %div = link_to namespace_project_tag_path(@project.namespace, @project, tag.name) do %span.item-title = icon('tag') = tag.name - if tag.message.present?   = strip_gpg_signature(tag.message) .controls - if can?(current_user, :download_code, @project) = render 'projects/tags/download', ref: tag.name, project: @project - if can?(current_user, :push_code, @project) = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, tag.name), class: 'btn-grouped btn has_tooltip', title: "Edit release notes" do = icon("pencil") - if can?(current_user, :admin_project, @project) = link_to namespace_project_tag_path(@project.namespace, @project, tag.name), class: 'btn btn-grouped btn-xs btn-remove remove-row has_tooltip', title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{tag.name}' tag cannot be undone. Are you sure?", container: 'body' }, remote: true do = icon("trash-o") - if commit = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this tag - if release && release.description.present? .description.prepend-top-default .wiki = preserve do = markdown release.description ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/_download.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/_download.html.ham0000644000175600017570000000142712672631600030721 0ustar pravipravi%span.btn-group.btn-grouped = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'zip'), class: 'btn btn-default', rel: 'nofollow' do %i.fa.fa-download %span source code %a.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown' } %span.caret %span.sr-only Select Archive Format %ul.col-xs-10.dropdown-menu{ role: 'menu' } %li = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'zip'), rel: 'nofollow' do %i.fa.fa-download %span Download zip %li = link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.gz'), rel: 'nofollow' do %i.fa.fa-download %span Download tar.gz gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tags/show.html.haml0000644000175600017570000000330412672631600030103 0ustar pravipravi- page_title @tag.name, "Tags" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block .pull-right - if can?(current_user, :push_code, @project) = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, @tag.name), class: 'btn-grouped btn has_tooltip', title: 'Edit release notes' do = icon("pencil") = link_to namespace_project_tree_path(@project.namespace, @project, @tag.name), class: 'btn btn-grouped has_tooltip', title: 'Browse files' do = icon('files-o') = link_to namespace_project_commits_path(@project.namespace, @project, @tag.name), class: 'btn btn-grouped has_tooltip', title: 'Browse commits' do = icon('history') - if can? current_user, :download_code, @project = render 'projects/tags/download', ref: @tag.name, project: @project - if can?(current_user, :admin_project, @project) .pull-right = link_to namespace_project_tag_path(@project.namespace, @project, @tag.name), class: 'btn btn-remove remove-row grouped has_tooltip', title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{@tag.name}' tag cannot be undone. Are you sure?" } do %i.fa.fa-trash-o .title %span.item-title= @tag.name - if @tag.message.present? %span.light   = strip_gpg_signature(@tag.message) - if @commit = render 'projects/branches/commit', commit: @commit, project: @project - else Cant find HEAD commit for this tag .append-bottom-default.prepend-top-default - if @release.description.present? .description .wiki = preserve do = markdown @release.description - else This tag has no release notes. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/releases/0000755000175600017570000000000012672631600026162 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/releases/edit.html.haml0000644000175600017570000000163412672631600030721 0ustar pravipravi- page_title "Edit", @tag.name, "Tags" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block .oneline .title Release notes for tag %strong #{@tag.name} .prepend-top-default = form_for(@release, method: :put, url: namespace_project_tag_release_path(@project.namespace, @project, @tag.name), html: { class: 'form-horizontal gfm-form release-form' }) do |f| = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :description, classes: 'description js-quick-submit form-control' = render 'projects/notes/hints' .error-alert .form-actions.prepend-top-default = f.submit 'Save changes', class: 'btn btn-save' = link_to "Cancel", namespace_project_tag_path(@project.namespace, @project, @tag.name), class: "btn btn-default btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_last_push.html.haml0000644000175600017570000000112012672631600030320 0ustar pravipravi- if event = last_push_event - if show_last_push_widget?(event) .gray-content-block.top-block.clear-block.hidden-xs .event-last-push .event-last-push-text %span You pushed to = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do %strong= event.ref_name branch #{time_ago_with_tooltip(event.created_at)} .pull-right = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do Create Merge Request gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/refs/0000755000175600017570000000000012672631600025316 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/refs/logs_tree.js.haml0000644000175600017570000000145412672631600030563 0ustar pravipravi- @logs.each do |content_data| - file_name = content_data[:file_name] - commit = content_data[:commit] - next unless commit :plain var row = $("table.table_#{@hex_path} tr.file_#{hexdigest(file_name)}"); row.find("td.tree_time_ago").html('#{escape_javascript time_ago_with_tooltip(commit.committed_date)}'); row.find("td.tree_commit").html('#{escape_javascript render("projects/tree/tree_commit_column", commit: commit)}'); - if @logs.present? :plain var current_url = location.href.replace(/\/?$/, '/'); var log_url = "#{escape_javascript(@log_url)}".replace(/\/?$/, '/'); if(current_url == log_url) { // Load more commit logs for each file in tree // if we still on the same page var url = "#{escape_javascript(@more_log_url)}"; ajaxGet(url); } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/0000755000175600017570000000000012672631600026055 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_fork.html.haml0000644000175600017570000000137312672631600030767 0ustar pravipravi- unless @project.empty_repo? - if current_user && can?(current_user, :fork_project, @project) - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn has_tooltip' do = icon('code-fork fw') Fork %div.count-with-arrow %span.arrow %span.count = @project.forks_count - else = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn has_tooltip' do = icon('code-fork fw') Fork %div.count-with-arrow %span.arrow %span.count = @project.forks_count ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_download.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_download.html.0000644000175600017570000000043712672631600030773 0ustar pravipravi- unless @project.empty_repo? - if can? current_user, :download_code, @project = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: @ref, format: 'zip'), class: 'btn has_tooltip', rel: 'nofollow', title: "Download ZIP" do = icon('download') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_star.html.haml0000644000175600017570000000124612672631600030776 0ustar pravipravi- if current_user = link_to toggle_star_namespace_project_path(@project.namespace, @project), class: 'btn star-btn toggle-star has_tooltip', method: :post, remote: true, title: "Star project" do - if current_user.starred?(@project) = icon('star fw') %span.starred Unstar - else = icon('star-o fw') %span Star %div.count-with-arrow %span.arrow %span.count.star-count = @project.star_count - else = link_to new_user_session_path, class: 'btn has_tooltip star-btn', title: 'You must sign in to star a project' do = icon('star fw') Star %div.count-with-arrow %span.arrow %span.count = @project.star_count ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_dropdown.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_dropdown.html.0000644000175600017570000000467612672631600031031 0ustar pravipravi- if current_user .btn-group %a.btn.dropdown-toggle{href: '#', "data-toggle" => "dropdown"} = icon('plus') %ul.dropdown-menu.dropdown-menu-right.project-home-dropdown - if can?(current_user, :create_issue, @project) %li = link_to url_for_new_issue(@project, only_path: true) do = icon('exclamation-circle fw') New issue - merge_project = can?(current_user, :create_merge_request, @project) ? @project : (current_user && current_user.fork_of(@project)) - if merge_project %li = link_to new_namespace_project_merge_request_path(merge_project.namespace, merge_project) do = icon('tasks fw') New merge request - if can?(current_user, :create_snippet, @project) %li = link_to new_namespace_project_snippet_path(@project.namespace, @project) do = icon('file-text-o fw') New snippet - if can?(current_user, :push_code, @project) %li.divider %li = link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do = icon('file fw') New file %li = link_to new_namespace_project_branch_path(@project.namespace, @project) do = icon('code-fork fw') New branch %li = link_to new_namespace_project_tag_path(@project.namespace, @project) do = icon('tags fw') New tag - elsif current_user && current_user.already_forked?(@project) %li.divider %li = link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do = icon('file fw') New file - elsif can?(current_user, :fork_project, @project) %li.divider %li - continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master'), notice: edit_in_new_fork_notice, notice_now: edit_in_new_fork_notice_now } - fork_path = namespace_project_forks_path(@project.namespace, @project, namespace_key: current_user.namespace.id, continue: continue_params) = link_to fork_path, method: :post do = icon('file fw') New file ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_notifications.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/buttons/_notifications.0000644000175600017570000000171212672631600031067 0ustar pravipravi- case @membership - when ProjectMember = form_tag profile_notifications_path, method: :put, remote: true, class: 'inline', id: 'notification-form' do = hidden_field_tag :notification_type, 'project' = hidden_field_tag :notification_id, @membership.id = hidden_field_tag :notification_level %span.dropdown %a.dropdown-new.btn.notifications-btn#notifications-button{href: '#', "data-toggle" => "dropdown"} = icon('bell') = notification_label(@membership) = icon('angle-down') %ul.dropdown-menu.dropdown-menu-right.project-home-dropdown - Notification.project_notification_levels.each do |level| = notification_list_item(level, @membership) - when GroupMember .btn.disabled.notifications-btn.has_tooltip{title: "To change the notification level, you need to be a member of the project itself, not only its group."} = icon('bell') = notification_label(@membership) = icon('angle-down') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/0000755000175600017570000000000012672631600027411 5ustar pravipravi././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/merge.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/merge.js0000644000175600017570000000065212672631600031051 0ustar pravipravi- case @status - when :success :plain merge_request_widget.mergeInProgress(#{params[:should_remove_source_branch] == '1'}); - when :merge_when_build_succeeds :plain $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/merge_when_build_succeeds'))}"); - else :plain $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/reload'))}"); ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/update_branches.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/update_b0000644000175600017570000000034412672631600031120 0ustar pravipravi:plain $(".target_branch").html("#{escape_javascript(options_for_select(@target_branches))}"); $('select.target_branch').select2({ width: 'resolve', dropdownAutoWidth: true }); $(".mr_target_commit").html(""); ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/branch_to.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/branch_t0000644000175600017570000000017112672631600031113 0ustar pravipravi:plain $(".mr_target_commit").html("#{commit_to_html(@commit, @target_project, false)}"); $('.js-timeago').timeago() ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/edit.htm0000644000175600017570000000030212672631600031043 0ustar pravipravi- page_title "Edit", "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" = render "header_title" %h3.page-title Edit Merge Request ##{@merge_request.iid} %hr = render 'form' ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/new.html0000644000175600017570000000026212672631600031070 0ustar pravipravi- page_title "New Merge Request" = render "header_title" - if @merge_request.can_be_created && !params[:change_branches] = render 'new_submit' - else = render 'new_compare' ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_head.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_head.ht0000644000175600017570000000035412672631600031010 0ustar pravipravi.top-tabs = link_to namespace_project_merge_requests_path(@project.namespace, @project), class: "tab #{'active' if current_page?(namespace_project_merge_requests_path(@project.namespace, @project)) }" do %span Merge Requests ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_header_0000644000175600017570000000017612672631600031066 0ustar pravipravi- header_title project_title(@project, "Merge Requests", namespace_project_merge_requests_path(@project.namespace, @project)) ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/cancel_merge_when_build_succeeds.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/cancel_m0000644000175600017570000000016212672631600031074 0ustar pravipravi:plain $('.mr-widget-body').html("#{escape_javascript(render('projects/merge_requests/widget/open/accept'))}"); ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/index.ht0000644000175600017570000000136312672631600031060 0ustar pravipravi- page_title "Merge Requests" = render "header_title" = render 'projects/last_push' .top-area = render 'shared/issuable/nav', type: :merge_requests .nav-controls = render 'shared/issuable/search_form', path: namespace_project_merge_requests_path(@project.namespace, @project) - merge_project = can?(current_user, :create_merge_request, @project) ? @project : (current_user && current_user.fork_of(@project)) - if merge_project = link_to new_namespace_project_merge_request_path(merge_project.namespace, merge_project), class: "btn btn-new", title: "New Merge Request" do = icon('plus') New Merge Request = render 'shared/issuable/filter', type: :merge_requests .merge-requests-holder = render 'merge_requests' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/0000755000175600017570000000000012672631600030674 5ustar pravipravi././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_locked.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000042512672631600031036 0ustar pravipravi.mr-state-widget = render 'projects/merge_requests/widget/heading' .mr-widget-body %h4 = icon("spinner spin") Merge in progress… %p This merge request is in the process of being merged, during which time it is locked and cannot be closed. ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_merged.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000421212672631600031034 0ustar pravipravi.mr-state-widget = render 'projects/merge_requests/widget/heading' .mr-widget-body %h4 Merged - if @merge_request.merge_event by #{link_to_member(@project, @merge_request.merge_event.author, avatar: true)} #{time_ago_with_tooltip(@merge_request.merge_event.created_at)} %div - if !@merge_request.source_branch_exists? || (params[:delete_source] == 'true') %p The changes were merged into #{link_to @merge_request.target_branch, namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch"}. The source branch has been removed. = render 'projects/merge_requests/widget/merged_buttons' - elsif @merge_request.can_remove_source_branch?(current_user) .remove_source_branch_widget %p The changes were merged into #{link_to @merge_request.target_branch, namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch"}. You can remove the source branch now. = render 'projects/merge_requests/widget/merged_buttons', source_branch_exists: true .remove_source_branch_widget.failed.hide %p Failed to remove source branch '#{@merge_request.source_branch}'. .remove_source_branch_in_progress.hide %p = icon('spinner spin') Removing source branch '#{@merge_request.source_branch}'. Please wait, this page will be automatically reloaded. :javascript $('.remove_source_branch').on('click', function() { $('.remove_source_branch_widget').hide(); $('.remove_source_branch_in_progress').show(); }); $(".remove_source_branch").on("ajax:success", function (e, data, status, xhr) { location.reload(); }); $(".remove_source_branch").on("ajax:error", function (e, data, status, xhr) { $('.remove_source_branch_widget').hide(); $('.remove_source_branch_in_progress').hide(); $('.remove_source_branch_widget.failed').show(); }); ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_heading.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000401012672631600031030 0ustar pravipravi- if @ci_commit .mr-widget-heading .ci_widget{class: "ci-#{@ci_commit.status}"} = ci_status_icon(@ci_commit) %span Build = ci_status_label(@ci_commit) for = succeed "." do = link_to @ci_commit.short_sha, namespace_project_commit_path(@merge_request.source_project.namespace, @merge_request.source_project, @ci_commit.sha), class: "monospace" %span.ci-coverage = link_to "View details", builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: "js-show-tab", data: {action: 'builds'} - elsif @merge_request.has_ci? - # Compatibility with old CI integrations (ex jenkins) when you request status from CI server via AJAX - # Remove in later versions when services like Jenkins will set CI status via Commit status API .mr-widget-heading - %w[success skipped canceled failed running pending].each do |status| .ci_widget{class: "ci-#{status}", style: "display:none"} = ci_icon_for_status(status) %span CI build = ci_label_for_status(status) for - commit = @merge_request.last_commit = succeed "." do = link_to commit.short_id, namespace_project_commit_path(@merge_request.source_project.namespace, @merge_request.source_project, commit), class: "monospace" %span.ci-coverage - if details_path = ci_build_details_path(@merge_request) = link_to "View details", details_path, :"data-no-turbolink" => "data-no-turbolink" .ci_widget = icon("spinner spin") Checking CI status for #{@merge_request.last_commit_short_sha}… .ci_widget.ci-not_found{style: "display:none"} = icon("times-circle") Could not find CI status for #{@merge_request.last_commit_short_sha}. .ci_widget.ci-error{style: "display:none"} = icon("times-circle") Could not connect to the CI server. Please check your settings and try again. :javascript $(function() { merge_request_widget.getCiStatus(); }); ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_open.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000246412672631600031043 0ustar pravipravi.mr-state-widget = render 'projects/merge_requests/widget/heading' .mr-widget-body - if @project.archived? = render 'projects/merge_requests/widget/open/archived' - elsif @merge_request.commits.blank? = render 'projects/merge_requests/widget/open/nothing' - elsif @merge_request.branch_missing? = render 'projects/merge_requests/widget/open/missing_branch' - elsif @merge_request.unchecked? = render 'projects/merge_requests/widget/open/check' - elsif @merge_request.cannot_be_merged? = render 'projects/merge_requests/widget/open/conflicts' - elsif @merge_request.work_in_progress? = render 'projects/merge_requests/widget/open/wip' - elsif @merge_request.merge_when_build_succeeds? = render 'projects/merge_requests/widget/open/merge_when_build_succeeds' - elsif !@merge_request.can_be_merged_by?(current_user) = render 'projects/merge_requests/widget/open/not_allowed' - elsif @merge_request.can_be_merged? = render 'projects/merge_requests/widget/open/accept' - if @closes_issues.present? .mr-widget-footer %span %i.fa.fa-check Accepting this merge request will close #{"issue".pluralize(@closes_issues.size)} = succeed '.' do != markdown issues_sentence(@closes_issues), pipeline: :gfm ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_closed.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000066612672631600031045 0ustar pravipravi.mr-state-widget = render 'projects/merge_requests/widget/heading' .mr-widget-body %h4 Closed - if @merge_request.closed_event by #{link_to_member(@project, @merge_request.closed_event.author, avatar: true)} #{time_ago_with_tooltip(@merge_request.closed_event.created_at)} %p = succeed '.' do The changes were not merged into %span.label-branch= @merge_request.target_branch ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000152712672631600031042 0ustar pravipravi- if @merge_request.open? = render 'projects/merge_requests/widget/open' - elsif @merge_request.merged? = render 'projects/merge_requests/widget/merged' - elsif @merge_request.closed? = render 'projects/merge_requests/widget/closed' - elsif @merge_request.locked? = render 'projects/merge_requests/widget/locked' :javascript var merge_request_widget; merge_request_widget = new MergeRequestWidget({ url_to_automerge_check: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", check_enable: #{@merge_request.unchecked? ? "true" : "false"}, url_to_ci_check: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", ci_enable: #{@project.ci_service ? "true" : "false"}, current_status: "#{@merge_request.gitlab_merge_status}", }); ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000755000175600017570000000000012672631600031053 5ustar pravipravi././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_reload.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000022112672631600031050 0ustar pravipravi%h4 = icon("exclamation-triangle") This merge request failed to be merged automatically %p Please reload the page to find out the reason. ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_accept.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000504412672631600031060 0ustar pravipravi- status_class = @ci_commit ? " ci-#{@ci_commit.status}" : nil = form_for [:merge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post, html: { class: 'accept-mr-form js-requires-input' } do |f| = hidden_field_tag :authenticity_token, form_authenticity_token .accept-merge-holder.clearfix.js-toggle-container .clearfix .accept-action - if @ci_commit && @ci_commit.active? %span.btn-group = button_tag class: "btn btn-create js-merge-button merge_when_build_succeeds" do Merge When Build Succeeds = button_tag class: "btn btn-success dropdown-toggle", 'data-toggle' => 'dropdown' do %span.caret %span.sr-only Select Merge Moment %ul.js-merge-dropdown.dropdown-menu.dropdown-menu-right{ role: 'menu' } %li = link_to "#", class: "merge_when_build_succeeds" do = icon('check fw') Merge When Build Succeeds %li = link_to "#", class: "accept_merge_request" do = icon('warning fw') Merge Immediately - else = f.button class: "btn btn-create btn-grouped js-merge-button accept_merge_request #{status_class}" do Accept Merge Request - if @merge_request.can_remove_source_branch?(current_user) .accept-control.checkbox = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do = check_box_tag :should_remove_source_branch Remove source branch .accept-control.right = link_to "#", class: "modify-merge-commit-link js-toggle-button" do = icon('edit') Modify commit message .js-toggle-content.hide.prepend-top-default = render 'shared/commit_message_container', params: params, text: @merge_request.merge_commit_message, rows: 14, hint: true = hidden_field_tag :merge_when_build_succeeds, "", autocomplete: "off" :javascript $('.accept-mr-form').on('ajax:send', function() { $(".accept-mr-form :input").disable(); }); $('.accept_merge_request').on('click', function() { $('.js-merge-button').html(" Merge in progress"); }); $('.merge_when_build_succeeds').on('click', function() { $("#merge_when_build_succeeds").val("1"); }); $('.js-merge-dropdown a').on('click', function(e) { e.preventDefault(); $(this).closest("form").submit(); }); ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_check.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000024312672631600031054 0ustar pravipravi%strong = icon("spinner spin") Checking ability to merge automatically… :javascript $(function() { merge_request_widget.getMergeStatus(); }); ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_conflicts.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000061712672631600031061 0ustar pravipravi%h4 = icon("exclamation-triangle") This merge request contains merge conflicts %p Please resolve these conflicts or - if @merge_request.can_be_merged_by?(current_user) #{link_to "merge this request manually", "#modal_merge_info", class: "how_to_merge_link vlink", "data-toggle" => "modal"}. - else ask someone with write access to this repository to merge this request manually. ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_missing_branch.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000103212672631600031051 0ustar pravipravi- unless @merge_request.source_branch_exists? %h4 = icon("exclamation-triangle") Source branch %span.label-branch= source_branch_with_namespace(@merge_request) does not exist %p Please restore the source branch or close this merge request and open a new merge request with a different source branch. - else %h4 = icon("exclamation-triangle") Target branch %span.label-branch= @merge_request.target_branch does not exist %p Please restore the target branch or use a different target branch. ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_archived.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000016412672631600031056 0ustar pravipravi%h4 Project is archived %p This merge request cannot be merged because archived projects cannot be written to. ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_nothing.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000041712672631600031057 0ustar pravipravi%h4 = icon("exclamation-triangle") Nothing to merge from %span.label-branch= source_branch_with_namespace(@merge_request) into %span.label-branch= @merge_request.target_branch %p Please push new commits to the source branch or use a different target branch. ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_merge_when_build_succeeds.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000312412672631600031055 0ustar pravipravi%h4 Set by #{link_to_member(@project, @merge_request.merge_user, avatar: true)} to be merged automatically when the build succeeds. %div - should_remove_source_branch = @merge_request.merge_params["should_remove_source_branch"].present? %p = succeed '.' do The changes will be merged into %span.label-branch= @merge_request.target_branch - if should_remove_source_branch The source branch will be removed. - else The source branch will not be removed. - remove_source_branch_button = @merge_request.can_remove_source_branch?(current_user) && !should_remove_source_branch && @merge_request.merge_user == current_user - user_can_cancel_automatic_merge = @merge_request.can_cancel_merge_when_build_succeeds?(current_user) - if remove_source_branch_button || user_can_cancel_automatic_merge .clearfix.prepend-top-10 - if remove_source_branch_button = link_to merge_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, merge_when_build_succeeds: true, should_remove_source_branch: true), remote: true, method: :post, class: "btn btn-grouped btn-primary btn-sm remove_source_branch" do = icon('times') Remove Source Branch When Merged - if user_can_cancel_automatic_merge = link_to cancel_merge_when_build_succeeds_namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request), remote: true, method: :post, class: "btn btn-grouped btn-warning btn-sm" do Cancel Automatic Merge ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_not_allowed.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000016512672631600031057 0ustar pravipravi%h4 Ready to be merged automatically %p Ask someone with write access to this repository to merge this request. ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/open/_wip.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/o0000644000175600017570000000024212672631600031053 0ustar pravipravi%h4 This merge request is currently a Work In Progress %p When this merge request is ready, remove the "WIP" prefix from the title to allow it to be merged. ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_merged_buttons.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/widget/_0000644000175600017570000000130612672631600031035 0ustar pravipravi- source_branch_exists = local_assigns.fetch(:source_branch_exists, false) - mr_can_be_reverted = @merge_request.can_be_reverted? - if source_branch_exists || mr_can_be_reverted .btn-group - if source_branch_exists = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), remote: true, method: :delete, class: "btn btn-default btn-grouped btn-sm remove_source_branch" do = icon('trash-o') Remove Source Branch - if mr_can_be_reverted = revert_commit_link(@merge_request.merge_commit, namespace_project_merge_request_path(@project.namespace, @project, @merge_request), btn_class: 'sm') ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_new_compare.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_new_com0000644000175600017570000001040312672631600031120 0ustar pravipravi%h3.page-title New Merge Request = form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: new_namespace_project_merge_request_path(@project.namespace, @project), method: :get, html: { class: "merge-request-form form-inline js-requires-input" } do |f| .hide.alert.alert-danger.mr-compare-errors .merge-request-branches.row .col-md-6 .panel.panel-default .panel-heading %strong Source branch .panel-body = f.select(:source_project_id, [[@merge_request.source_project_path,@merge_request.source_project.id]] , {}, { class: 'source_project select2 span3', disabled: @merge_request.persisted?, required: true })   = f.select(:source_branch, @merge_request.source_branches, { include_blank: true }, { class: 'source_branch select2 span2', required: true, data: { placeholder: "Select source branch" } }) .panel-footer .mr_source_commit .col-md-6 .panel.panel-default .panel-heading %strong Target branch .panel-body - projects = @project.forked_from_project.nil? ? [@project] : [@project, @project.forked_from_project] = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted?, required: true })   = f.select(:target_branch, @merge_request.target_branches, { include_blank: true }, { class: 'target_branch select2 span2', required: true, data: { placeholder: "Select target branch" } }) .panel-footer .mr_target_commit - if @merge_request.errors.any? .alert.alert-danger - @merge_request.errors.full_messages.each do |msg| %div= msg - elsif @merge_request.source_branch.present? && @merge_request.target_branch.present? - if @merge_request.compare_failed .alert.alert-danger %h4 Compare failed %p We can't compare selected branches. It may be because of huge diff. Please try again or select different branches. - else .light-well.append-bottom-default .center %h4 There isn't anything to merge. %p.slead - if @merge_request.source_branch == @merge_request.target_branch You'll need to use different branch names to get a valid comparison. - else %span.label-branch #{@merge_request.source_branch} and %span.label-branch #{@merge_request.target_branch} are the same. .form-actions = f.submit 'Compare branches and continue', class: "btn btn-new mr-compare-btn" :javascript var source_branch = $("#merge_request_source_branch") , target_branch = $("#merge_request_target_branch") , target_project = $("#merge_request_target_project_id"); $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: source_branch.val() }); $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() }); target_project.on("change", function() { $.get("#{update_branches_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: $(this).val() }); }); source_branch.on("change", function() { $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: $(this).val() }); $(".mr-compare-errors").fadeOut(); $(".mr-compare-btn").enable(); }); target_branch.on("change", function() { $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: $(this).val() }); $(".mr-compare-errors").fadeOut(); $(".mr-compare-btn").enable(); }); :javascript $(".merge-request-form").on('submit', function () { if ($("#merge_request_source_branch").val() === "" || $('#merge_request_target_branch').val() === "") { $(".mr-compare-errors").html("You must select source and target branch to proceed"); $(".mr-compare-errors").fadeIn(); event.preventDefault(); return; } }); ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_form.ht0000644000175600017570000000062712672631600031055 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: 'merge-request-form form-horizontal gfm-form js-requires-input' } do |f| = render 'shared/issuable/form', f: f, issuable: @merge_request :javascript $('.assign-to-me-link').on('click', function(e){ $('#merge_request_assignee_id').val("#{current_user.id}").trigger("change"); e.preventDefault(); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/0000755000175600017570000000000012672631600030371 5ustar pravipravi././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_diffs.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_di0000644000175600017570000000114012672631600031043 0ustar pravipravi- if @merge_request_diff.collected? = render "projects/diffs/diffs", diffs: params[:w] == '1' ? @merge_request.diffs_no_whitespace : @merge_request.diffs, project: @merge_request.project, diff_refs: @merge_request.diff_refs - elsif @merge_request_diff.empty? .nothing-here-block Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch} - else .alert.alert-warning %h4 Changes view for this comparison is extremely large. %p You can = link_to "download it", merge_request_path(@merge_request, format: :diff), class: "vlink" instead. ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_mr_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_mr0000644000175600017570000000124312672631600031071 0ustar pravipravi.detail-page-description.content-block %h2.title = markdown escape_once(@merge_request.title), pipeline: :single_line %div - if @merge_request.description.present? .description{class: can?(current_user, :update_merge_request, @merge_request) ? 'js-task-list-container' : ''} .wiki = preserve do = markdown(@merge_request.description, cache_key: [@merge_request, "description"]) %textarea.hidden.js-task-list-field = @merge_request.description - if @merge_request.updated_at != @merge_request.created_at %small Edited = time_ago_with_tooltip(@merge_request.updated_at, placement: 'bottom') ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_builds.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_bu0000644000175600017570000000007012672631600031056 0ustar pravipravi= render "projects/commit/builds", link_to_commit: true ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_commits.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_co0000644000175600017570000000024612672631600031056 0ustar pravipravi.content-block.oneline-block = icon("sort-amount-desc") Most recent commits displayed first = render "projects/commits/commits", project: @merge_request.project ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_mr_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_mr0000644000175600017570000000215412672631600031073 0ustar pravipravi.detail-page-header .status-box{ class: status_box_class(@merge_request) } = @merge_request.state_human_name %span.identifier Merge Request ##{@merge_request.iid} %span.creator · by #{link_to_member(@project, @merge_request.author, size: 24)} · = time_ago_with_tooltip(@merge_request.created_at) .issue-btn-group.pull-right - if can?(current_user, :update_merge_request, @merge_request) - if @merge_request.open? = link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, class: 'btn btn-nr btn-grouped btn-close', title: 'Close merge request' = link_to edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: 'btn btn-nr btn-grouped issuable-edit', id: 'edit_merge_request' do %i.fa.fa-pencil-square-o Edit - if @merge_request.closed? = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: 'btn btn-nr btn-grouped btn-reopen reopen-mr-link', title: 'Reopen merge request' ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_how_to_merge.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show/_ho0000644000175600017570000000470512672631600031067 0ustar pravipravi%div#modal_merge_info.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Check out, review, and merge locally .modal-body %p %strong Step 1. Fetch and check out the branch for this merge request = clipboard_button(clipboard_target: 'pre#merge-info-1') %pre.dark#merge-info-1 - if @merge_request.for_fork? :preserve git fetch #{h @merge_request.source_project.http_url_to_repo} #{h @merge_request.source_branch} git checkout -b #{h @merge_request.source_project_path}-#{h @merge_request.source_branch} FETCH_HEAD - else :preserve git fetch origin git checkout -b #{h @merge_request.source_branch} origin/#{h @merge_request.source_branch} %p %strong Step 2. Review the changes locally %p %strong Step 3. Merge the branch and fix any conflicts that come up = clipboard_button(clipboard_target: 'pre#merge-info-3') %pre.dark#merge-info-3 - if @merge_request.for_fork? :preserve git checkout #{h @merge_request.target_branch} git merge --no-ff #{h @merge_request.source_project_path}-#{h @merge_request.source_branch} - else :preserve git checkout #{h @merge_request.target_branch} git merge --no-ff #{h @merge_request.source_branch} %p %strong Step 4. Push the result of the merge to GitLab = clipboard_button(clipboard_target: 'pre#merge-info-4') %pre.dark#merge-info-4 :preserve git push origin #{h @merge_request.target_branch} - unless @merge_request.can_be_merged_by?(current_user) %p Note that pushing to GitLab requires write access to this repository. %p %strong Tip: You can also checkout merge requests locally by %a{href: 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/workflow/merge_requests.md#checkout-merge-requests-locally', target: '_blank'} following these guidelines :javascript $(function(){ var modal = $('#modal_merge_info').modal({modal: true, show:false}); $('.how_to_merge_link').bind("click", function(){ modal.show(); }); $('.modal-header .close').bind("click", function(){ modal.hide(); }) }) ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/update.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/update.j0000644000175600017570000000030112672631600031040 0ustar pravipravi$('aside.right-sidebar')[0].outerHTML = "#{escape_javascript(render 'shared/issuable/sidebar', issuable: @merge_request)}"; $('aside.right-sidebar').effect('highlight'); new IssuableContext(); ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_show.ht0000644000175600017570000001006012672631600031062 0ustar pravipravi- page_title "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" - page_description @merge_request.description - page_card_attributes @merge_request.card_attributes = render "header_title" - if params[:view] == 'parallel' - fluid_layout true .merge-request{'data-url' => merge_request_path(@merge_request)} = render "projects/merge_requests/show/mr_title" .merge-request-details.issuable-details = render "projects/merge_requests/show/mr_box" .append-bottom-default.mr-source-target.prepend-top-default - if @merge_request.open? .pull-right - if @merge_request.source_branch_exists? = link_to "#modal_merge_info", class: "btn btn-sm", "data-toggle" => "modal" do = icon('cloud-download fw') Check out branch %span.dropdown %a.btn.btn-sm.dropdown-toggle{ data: {toggle: :dropdown} } = icon('download') Download as %span.caret %ul.dropdown-menu %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) .normal %span Request to merge %span.label-branch= source_branch_with_namespace(@merge_request) %span into = link_to namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch" do = @merge_request.target_branch = render "projects/merge_requests/show/how_to_merge" = render "projects/merge_requests/widget/show.html.haml" - if @merge_request.source_branch_exists? && @merge_request.mergeable? && @merge_request.can_be_merged_by?(current_user) .light.prepend-top-default You can also accept this merge request manually using the = succeed '.' do = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" - if @commits.present? %ul.merge-request-tabs.nav-links.no-top.no-bottom %li.notes-tab = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: 'div#notes', action: 'notes', toggle: 'tab'} do Discussion %span.badge= @merge_request.mr_and_commit_notes.user.count %li.commits-tab = link_to commits_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: 'div#commits', action: 'commits', toggle: 'tab'} do Commits %span.badge= @commits.size - if @ci_commit %li.builds-tab = link_to builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#builds', action: 'builds', toggle: 'tab'} do Builds %span.badge= @statuses.size %li.diffs-tab = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: 'div#diffs', action: 'diffs', toggle: 'tab'} do Changes %span.badge= @merge_request.diffs.size .tab-content #notes.notes.tab-pane.voting_notes .content-block.oneline-block = render 'votes/votes_block', votable: @merge_request .row %section.col-md-12 .issuable-discussion = render "projects/merge_requests/discussion" #commits.commits.tab-pane - # This tab is always loaded via AJAX #builds.builds.tab-pane - # This tab is always loaded via AJAX #diffs.diffs.tab-pane - # This tab is always loaded via AJAX .mr-loading-status = spinner = render 'shared/issuable/sidebar', issuable: @merge_request - if @merge_request.can_be_reverted? = render "projects/commit/revert", commit: @merge_request.merge_commit, title: @merge_request.title :javascript var merge_request; merge_request = new MergeRequest({ action: "#{controller.action_name}" }); ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_merge_request.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_merge_r0000644000175600017570000000535612672631600031124 0ustar pravipravi%li{ class: mr_css_classes(merge_request) } .merge-request-title %span.merge-request-title-text = link_to_gfm merge_request.title, merge_request_path(merge_request), class: "row_title" %ul.controls.light - if merge_request.merged? %li MERGED - elsif merge_request.closed? %li = icon('ban') CLOSED - if merge_request.ci_commit %li = render_ci_status(merge_request.ci_commit) - if merge_request.open? && merge_request.broken? %li = link_to merge_request_path(merge_request), class: "has_tooltip", title: "Cannot be merged automatically", data: { container: 'body' } do = icon('exclamation-triangle') - if merge_request.assignee %li = link_to_member(merge_request.source_project, merge_request.assignee, name: false, title: "Assigned to :name") - upvotes, downvotes = merge_request.upvotes, merge_request.downvotes - if upvotes > 0 %li = icon('thumbs-up') = upvotes - if downvotes > 0 %li = icon('thumbs-down') = downvotes - note_count = merge_request.mr_and_commit_notes.user.count - if note_count > 0 %li = link_to merge_request_path(merge_request) + "#notes" do = icon('comments') = note_count - else %li = link_to merge_request_path(merge_request) + "#notes", class: "merge-request-no-comments" do = icon('comments') = note_count .merge-request-info \##{merge_request.iid} · opened #{time_ago_with_tooltip(merge_request.created_at, placement: 'bottom')} by #{link_to_member(@project, merge_request.author, avatar: false)} - if merge_request.target_project.default_branch != merge_request.target_branch   = link_to namespace_project_commits_path(merge_request.project.namespace, merge_request.project, merge_request.target_branch) do = icon('code-fork') = merge_request.target_branch - if merge_request.milestone   = link_to namespace_project_merge_requests_path(merge_request.project.namespace, merge_request.project, milestone_title: merge_request.milestone.title) do = icon('clock-o') = merge_request.milestone.title - if merge_request.labels.any?   - merge_request.labels.each do |label| = link_to_label(label, project: merge_request.project, type: 'merge_request') - if merge_request.tasks?   %span.task-status = merge_request.task_status .pull-right.hidden-xs %span updated #{time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago')} ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/invalid.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/invalid.0000644000175600017570000000167312672631600031047 0ustar pravipravi- page_title "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" = render "header_title" .merge-request = render "projects/merge_requests/show/mr_title" = render "projects/merge_requests/show/mr_box" .alert.alert-danger %p We cannot render this merge request properly because - if @merge_request.for_fork? && !@merge_request.source_project fork project was removed - elsif !@merge_request.source_branch_exists? %span.label.label-inverse= @merge_request.source_branch does not exist in %span.label.label-info= @merge_request.source_project_path - elsif !@merge_request.target_branch_exists? %span.label.label-inverse= @merge_request.target_branch does not exist in %span.label.label-info= @merge_request.target_project_path - else of internal error %strong Please close Merge Request or change branches with existing one ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/diffs.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/diffs.ht0000644000175600017570000000002012672631600031031 0ustar pravipravi= render "show" ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_merge_r0000644000175600017570000000033412672631600031113 0ustar pravipravi%ul.content-list.mr-list = render @merge_requests - if @merge_requests.blank? %li .nothing-here-block No merge requests to show - if @merge_requests.present? = paginate @merge_requests, theme: "gitlab" ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/show.htm0000644000175600017570000000002012672631600031073 0ustar pravipravi= render "show" ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_new_submit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_new_sub0000644000175600017570000000457312672631600031146 0ustar pravipravi%h3.page-title New Merge Request %p.slead - source_title, target_title = format_mr_branch_names(@merge_request) From %strong.label-branch #{source_title} %span into %strong.label-branch #{target_title} %span.pull-right = link_to 'Change branches', mr_change_branches_path(@merge_request) %hr = form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: 'merge-request-form form-horizontal gfm-form js-requires-input' } do |f| = render 'shared/issuable/form', f: f, issuable: @merge_request = f.hidden_field :source_project_id = f.hidden_field :source_branch = f.hidden_field :target_project_id = f.hidden_field :target_branch .mr-compare.merge-request %ul.merge-request-tabs.nav-links.no-top.no-bottom %li.commits-tab = link_to url_for(params), data: {target: 'div#commits', action: 'commits', toggle: 'tab'} do Commits %span.badge= @commits.size - if @ci_commit %li.builds-tab.active = link_to url_for(params), data: {target: 'div#builds', action: 'builds', toggle: 'tab'} do Builds %span.badge= @statuses.size %li.diffs-tab.active = link_to url_for(params), data: {target: 'div#diffs', action: 'diffs', toggle: 'tab'} do Changes %span.badge= @diffs.size .tab-content #commits.commits.tab-pane = render "projects/merge_requests/show/commits" #diffs.diffs.tab-pane.active - if @diffs.present? = render "projects/diffs/diffs", diffs: @diffs, project: @project, diff_refs: @merge_request.diff_refs - elsif @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE .alert.alert-danger %h4 This comparison includes more than #{MergeRequestDiff::COMMITS_SAFE_SIZE} commits. %p To preserve performance the line changes are not shown. - else .alert.alert-danger %h4 This comparison includes a huge diff. %p To preserve performance the line changes are not shown. - if @ci_commit #builds.builds.tab-pane = render "projects/merge_requests/show/builds" :javascript $('.assign-to-me-link').on('click', function(e){ $('#merge_request_assignee_id').val("#{current_user.id}").trigger("change"); e.preventDefault(); }); :javascript var merge_request merge_request = new MergeRequest({ action: 'new', diffs_loaded: true, commits_loaded: true }); ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_discussion.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/_discuss0000644000175600017570000000124712672631600031154 0ustar pravipravi- content_for :note_actions do - if can?(current_user, :update_merge_request, @merge_request) - if @merge_request.open? = link_to 'Close', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-nr btn-comment btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - if @merge_request.closed? = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-nr btn-comment btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" #notes= render "projects/notes/notes_with_form" ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/branch_from.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/merge_requests/branch_f0000644000175600017570000000017112672631600031075 0ustar pravipravi:plain $(".mr_source_commit").html("#{commit_to_html(@commit, @source_project, false)}"); $('.js-timeago').timeago() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/0000755000175600017570000000000012672631600026541 5ustar pravipravi././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_issues.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_issues.html0000644000175600017570000000040312672631600031076 0ustar pravipravi.panel.panel-default .panel-heading = title .pull-right= issues.size %ul{ class: "well-list issues-sortable-list", id: "issues-list-#{id}", "data-state" => id } - issues.sort_by(&:position).each do |issue| = render 'issue', issue: issue ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_milestone.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_milestone.h0000644000175600017570000000322612672631600031053 0ustar pravipravi%li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone) } .row .col-sm-6 %strong = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) .col-sm-6 .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to namespace_project_issues_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.issues.count, 'Issue' · = link_to namespace_project_merge_requests_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.merge_requests.count, 'Merge Request' .col-sm-6 = milestone_progress_bar(milestone) .row .col-sm-6 = render 'shared/milestone_expired', milestone: milestone .col-sm-6 - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-xs" do = icon('pencil-square-o') Edit \ = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-xs btn-close" = link_to namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-xs btn-remove" do = icon('trash-o') Delete ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/edit.html.ha0000644000175600017570000000022612672631600030743 0ustar pravipravi- page_title "Edit", @milestone.title, "Milestones" = render "header_title" %h3.page-title Edit Milestone ##{@milestone.iid} %hr = render "form" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/new.html.ham0000644000175600017570000000015312672631600030763 0ustar pravipravi- page_title "New Milestone" = render "header_title" %h3.page-title New Milestone %hr = render "form" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_issue.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_issue.html.0000644000175600017570000000102712672631600030774 0ustar pravipravi%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => issue_path(issue) } %span = link_to_gfm issue.title, [@project.namespace.becomes(Namespace), @project, issue], title: issue.title .issue-detail = link_to [@project.namespace.becomes(Namespace), @project, issue] do %span.issue-number ##{issue.iid} - issue.labels.each do |label| = render_colored_label(label) - if issue.assignee = image_tag avatar_icon(issue.assignee, 16), class: "avatar s24", alt: '' ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_header_titl0000644000175600017570000000016612672631600031112 0ustar pravipravi- header_title project_title(@project, "Milestones", namespace_project_milestones_path(@project.namespace, @project)) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/index.html.h0000644000175600017570000000103312672631600030761 0ustar pravipravi- page_title "Milestones" = render "header_title" .top-area = render 'shared/milestones_filter' .nav-controls - if can?(current_user, :admin_milestone, @project) = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "btn btn-new", title: "New Milestone" do = icon('plus') New Milestone .milestones %ul.content-list = render @milestones - if @milestones.blank? %li .nothing-here-block No milestones to show = paginate @milestones, theme: "gitlab" ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_form.html.h0000644000175600017570000000341512672631600030762 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @milestone], html: {class: 'form-horizontal milestone-form gfm-form js-requires-input'} do |f| -if @milestone.errors.any? .alert.alert-danger %ul - @milestone.errors.full_messages.each do |msg| %li= msg .row .col-md-6 .form-group = f.label :title, "Title", class: "control-label" .col-sm-10 = f.text_field :title, maxlength: 255, class: "form-control js-quick-submit", required: true, autofocus: true .form-group.milestone-description = f.label :description, "Description", class: "control-label" .col-sm-10 = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control js-quick-submit' = render 'projects/notes/hints' .clearfix .error-alert .col-md-6 .form-group = f.label :due_date, "Due Date", class: "control-label" .col-sm-10= f.hidden_field :due_date .col-sm-10 .datepicker .form-actions - if @milestone.new_record? = f.submit 'Create milestone', class: "btn-create btn" = link_to "Cancel", namespace_project_milestones_path(@project.namespace, @project), class: "btn btn-cancel" -else = f.submit 'Save changes', class: "btn-save btn" = link_to "Cancel", namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-cancel" :javascript $(".datepicker").datepicker({ dateFormat: "yy-mm-dd", onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/update.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/update.js.ha0000644000175600017570000000006012672631600030744 0ustar pravipravi:plain $('##{dom_id(@milestone)}').fadeOut(); ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_merge_request.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_merge_reque0000644000175600017570000000107112672631600031122 0ustar pravipravi%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => merge_request_path(merge_request) } %span.str-truncated = link_to [@project.namespace.becomes(Namespace), @project, merge_request] do %span.cgray ##{merge_request.iid} = link_to_gfm merge_request.title, [@project.namespace.becomes(Namespace), @project, merge_request], title: merge_request.title .pull-right.assignee-icon - if merge_request.assignee = image_tag avatar_icon(merge_request.assignee, 16), class: "avatar s16", alt: '' ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/_merge_reque0000644000175600017570000000043112672631600031121 0ustar pravipravi.panel.panel-default .panel-heading= title %ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id } - merge_requests.sort_by(&:position).each do |merge_request| = render 'merge_request', merge_request: merge_request ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/milestones/show.html.ha0000644000175600017570000001366612672631600031012 0ustar pravipravi- page_title @milestone.title, "Milestones" - page_description @milestone.description = render "header_title" .detail-page-header .status-box{ class: status_box_class(@milestone) } - if @milestone.closed? Closed - elsif @milestone.expired? Expired - else Open %span.identifier Milestone ##{@milestone.iid} - if @milestone.expires_at %span.creator · = @milestone.expires_at .pull-right - if can?(current_user, :admin_milestone, @project) - if @milestone.active? = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-nr btn-grouped" - else = link_to 'Reopen Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-nr btn-grouped" = link_to namespace_project_milestone_path(@project.namespace, @project, @milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-grouped btn-nr" do = icon('trash-o') Delete = link_to edit_namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-grouped btn-nr" do = icon('pencil-square-o') Edit .detail-page-description.milestone-detail.second-block %h2.title = markdown escape_once(@milestone.title), pipeline: :single_line %div - if @milestone.description.present? .description .wiki = preserve do = markdown @milestone.description - if @milestone.issues.any? && @milestone.can_be_closed? .alert.alert-success.prepend-top-default %span All issues for this milestone are closed. You may close milestone now. .context.prepend-top-default .milestone-summary %h4 Progress %strong= @milestone.issues.count issues: %span.milestone-stat %strong= @milestone.open_items_count open and %strong= @milestone.closed_items_count closed %span.milestone-stat %strong== #{@milestone.percent_complete}% complete %span.milestone-stat %span.remaining-days= milestone_remaining_days(@milestone) %span.pull-right.tab-issues-buttons - if can?(current_user, :create_issue, @project) = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do %i.fa.fa-plus New Issue - if can?(current_user, :read_issue, @project) = link_to 'Browse Issues', namespace_project_issues_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped" %span.pull-right.tab-merge-requests-buttons.hidden - if can?(current_user, :read_merge_request, @project) = link_to 'Browse Merge Requests', namespace_project_merge_requests_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped" = milestone_progress_bar(@milestone) %ul.nav-links.no-top.no-bottom %li.active = link_to '#tab-issues', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do Issues %span.badge= @issues.count %li = link_to '#tab-merge-requests', 'data-toggle' => 'tab', 'data-show' => '.tab-merge-requests-buttons' do Merge Requests %span.badge= @merge_requests.count %li = link_to '#tab-participants', 'data-toggle' => 'tab' do Participants %span.badge= @users.count %li = link_to '#tab-labels', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do Labels %span.badge= @labels.count .tab-content.milestone-content .tab-pane.active#tab-issues .row.prepend-top-default .col-md-4 = render('issues', title: 'Unstarted Issues (open and unassigned)', issues: @issues.opened.unassigned, id: 'unassigned') .col-md-4 = render('issues', title: 'Ongoing Issues (open and assigned)', issues: @issues.opened.assigned, id: 'ongoing') .col-md-4 = render('issues', title: 'Completed Issues (closed)', issues: @issues.closed, id: 'closed') .tab-pane#tab-merge-requests .row.prepend-top-default .col-md-3 = render('merge_requests', title: 'Work in progress (open and unassigned)', merge_requests: @merge_requests.opened.unassigned, id: 'unassigned') .col-md-3 = render('merge_requests', title: 'Waiting for merge (open and assigned)', merge_requests: @merge_requests.opened.assigned, id: 'ongoing') .col-md-3 = render('merge_requests', title: 'Rejected (closed)', merge_requests: @merge_requests.closed, id: 'closed') .col-md-3 .panel.panel-primary .panel-heading Merged %ul.well-list - @merge_requests.merged.each do |merge_request| = render 'merge_request', merge_request: merge_request .tab-pane#tab-participants %ul.bordered-list - @users.each do |user| %li = link_to user, title: user.name, class: "darken" do = image_tag avatar_icon(user, 32), class: "avatar s32" %strong= truncate(user.name, lenght: 40) %br %small.cgray= user.username .tab-pane#tab-labels %ul.bordered-list.manage-labels-list - @labels.each do |label| %li = render_colored_label(label) - args = [@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title, label_name: label.title] - options = args.extract_options! %span.issues-count = link_to namespace_project_issues_path(*args, options.merge(state: 'opened')) do = pluralize label.open_issues_count, 'open issue' %span.issues-count = link_to namespace_project_issues_path(*args, options.merge(state: 'closed')) do = pluralize label.closed_issues_count, 'closed issue' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/0000755000175600017570000000000012672631600026202 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/edit.html.haml0000644000175600017570000000007012672631600030732 0ustar pravipravi- page_title @service.title, "Services" = render 'form' ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/index.html.ham0000644000175600017570000000123012672631600030737 0ustar pravipravi- page_title "Services" %h3.page-title Project services %p.light Project services allow you to integrate GitLab with other applications .table-holder %table.table %thead %tr %th %th Service %th Description %th Last edit - @services.sort_by(&:title).each do |service| %tr %td = boolean_to_icon service.activated? %td = link_to edit_namespace_project_service_path(@project.namespace, @project, service.to_param) do %strong= service.title %td = service.description %td.light = time_ago_in_words service.updated_at ago ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/services/_form.html.ham0000644000175600017570000000141112672631600030733 0ustar pravipravi%h3.page-title = @service.title = boolean_to_icon @service.activated? %p= @service.description %hr = form_for(@service, as: :service, url: namespace_project_service_path(@project.namespace, @project, @service.to_param), method: :put, html: { class: 'form-horizontal' }) do |form| = render 'shared/service_settings', form: form .form-actions = form.submit 'Save changes', class: 'btn btn-save'   - if @service.valid? && @service.activated? - disabled = @service.can_test? ? '':'disabled' = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}" = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/transfer.js.haml0000644000175600017570000000013312672631600027456 0ustar pravipravi:plain location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/0000755000175600017570000000000012672631600025505 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/pages.html.haml0000644000175600017570000000063212672631600030413 0ustar pravipravi- page_title "Pages", "Wiki" = render "header_title" = render 'nav' %ul.content-list - @wiki_pages.each do |wiki_page| %li = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) %small (#{wiki_page.format}) .pull-right %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} = paginate @wiki_pages, theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_new.html.haml0000644000175600017570000000117312672631600030245 0ustar pravipravi%div#modal-new-wiki.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title New Wiki Page .modal-body %form.new-wiki-page .form-group = label_tag :new_wiki_path do %span Page slug = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project), autofocus: true .form-actions = button_tag 'Create Page', class: 'build-new-wiki btn btn-create' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/edit.html.haml0000644000175600017570000000063712672631600030246 0ustar pravipravi- page_title "Edit", @page.title.capitalize, "Wiki" = render "header_title" = render 'nav' .top-area .nav-text %strong - if @page.persisted? = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) - else = @page.title.capitalize %span.light · Edit Page .nav-controls = render 'main_links' = render 'form' ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_main_links.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_main_links.html.0000644000175600017570000000120112672631600030726 0ustar pravipravi- if (@page && @page.persisted?) = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do Page History - if can?(current_user, :create_wiki, @project) = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit - if can?(current_user, :admin_wiki, @project) = link_to namespace_project_wiki_path(@project.namespace, @project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-remove" do = icon('trash') Delete ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_header_title.htm0000644000175600017570000000012012672631600031000 0ustar pravipravi- header_title project_title(@project, 'Wiki', get_project_wiki_path(@project)) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_form.html.haml0000644000175600017570000000305612672631600030421 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form gfm-form prepend-top-default' } do |f| -if @page.errors.any? #error_explanation .alert.alert-danger - @page.errors.full_messages.each do |msg| %p= msg = f.hidden_field :title, value: @page.title .form-group = f.label :format, class: 'control-label' .col-sm-10 = f.select :format, options_for_select(ProjectWiki::MARKUPS, {selected: @page.format}), {}, class: "form-control" .form-group = f.label :content, class: 'control-label' .col-sm-10 = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do = render 'projects/zen', f: f, attr: :content, classes: 'description form-control js-quick-submit' = render 'projects/notes/hints' .clearfix .error-alert .help-block To link to a (new) page, simply type %code [Link Title](page-slug) \. .form-group = f.label :commit_message, class: 'control-label' .col-sm-10= f.text_field :message, class: 'form-control', rows: 18 .form-actions - if @page && @page.persisted? = f.submit 'Save changes', class: "btn-save btn" = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-cancel" - else = f.submit 'Create page', class: "btn-create btn" = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, :home), class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/_nav.html.haml0000644000175600017570000000131412672631600030235 0ustar pravipravi.top-area %ul.nav-links = nav_link(html_options: {class: params[:id] == 'home' ? 'active' : '' }) do = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) = nav_link(path: 'wikis#pages') do = link_to 'Pages', namespace_project_wiki_pages_path(@project.namespace, @project) = nav_link(path: 'wikis#git_access') do = link_to namespace_project_wikis_git_access_path(@project.namespace, @project) do Git Access .nav-controls - if can?(current_user, :create_wiki, @project) = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do = icon('plus') New Page = render 'projects/wikis/new' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/empty.html.haml0000644000175600017570000000020512672631600030446 0ustar pravipravi- page_title "Wiki" = render "header_title" %h3.page-title Empty page %hr .error_message You are not allowed to create wiki pages ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/git_access.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/git_access.html.h0000644000175600017570000000157512672631600030735 0ustar pravipravi- page_title "Git Access", "Wiki" = render "header_title" = render 'nav' .gray-content-block %span.oneline Git access for %strong= @project_wiki.path_with_namespace .pull-right = render "shared/clone_panel", project: @project_wiki .git-empty.prepend-top-default %fieldset %legend Install Gollum: %pre.dark :preserve gem install gollum %legend Clone Your Wiki: %pre.dark :preserve git clone #{ content_tag(:span, default_url_to_repo(@project_wiki), class: 'clone')} cd #{h @project_wiki.path} %legend Start Gollum And Edit Locally: %pre.dark :preserve gollum == Sinatra/1.3.5 has taken the stage on 4567 for development with backup from Thin >> Thin web server (v1.5.0 codename Knife) >> Maximum connections set to 1024 >> Listening on 0.0.0.0:4567, CTRL+C to stop gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/history.html.haml0000644000175600017570000000201112672631600031006 0ustar pravipravi- page_title "History", @page.title.capitalize, "Wiki" = render "header_title" = render 'nav' .top-area .nav-text %strong = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) %span.light · History .table-holder %table.table %thead %tr %th Page version %th Author %th Commit Message %th Last updated %th Format %tbody - @page.versions.each_with_index do |version, index| - commit = version %tr %td = link_to project_wiki_path_with_version(@project, @page, commit.id, index == 0) do = truncate_sha(commit.id) %td = commit.author.name %td = commit.message %td #{time_ago_with_tooltip(version.authored_date)} %td %strong = @page.page.wiki.page(@page.page.name, commit.id).try(:format) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/wikis/show.html.haml0000644000175600017570000000134512672631600030276 0ustar pravipravi- page_title @page.title.capitalize, "Wiki" = render "header_title" = render 'nav' .top-area .nav-text %strong= @page.title.capitalize %span.wiki-last-edit-by · last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} .nav-controls = render 'main_links' - if @page.historical? .warning_message This is an old version of this page. You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. .wiki-holder.prepend-top-default .wiki = preserve do = render_wiki_content(@page) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/0000755000175600017570000000000012672631600026706 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/new.html.ha0000644000175600017570000000012112672631600030746 0ustar pravipravi- page_title "New Deploy Key" %h3.page-title New Deploy Key %hr = render 'form' ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/index.html.0000644000175600017570000000272712672631600030771 0ustar pravipravi- page_title "Deploy Keys" %h3.page-title Deploy keys allow read-only access to the repository = link_to new_namespace_project_deploy_key_path(@project.namespace, @project), class: "btn btn-new pull-right", title: "New Deploy Key" do %i.fa.fa-plus New Deploy Key %p.light Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one %hr.clearfix .row .col-md-6.enabled-keys %h5 %strong.cgreen Enabled deploy keys for this project %ul.bordered-list = render @enabled_keys - if @enabled_keys.blank? .light-well .nothing-here-block Create a #{link_to 'new deploy key', new_namespace_project_deploy_key_path(@project.namespace, @project)} or add an existing one .col-md-6.available-keys - # If there are available public deploy keys but no available project deploy keys, only public deploy keys are shown. - if @available_project_keys.any? || @available_public_keys.blank? %h5 %strong Deploy keys from projects you have access to %ul.bordered-list = render @available_project_keys - if @available_project_keys.blank? .light-well .nothing-here-block Deploy keys from projects you have access to will be displayed here - if @available_public_keys.any? %h5 %strong Public deploy keys available to any project %ul.bordered-list = render @available_public_keys ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/_form.html.0000644000175600017570000000175112672631600030760 0ustar pravipravi%div = form_for [@project.namespace.becomes(Namespace), @project, @key], url: namespace_project_deploy_keys_path, html: { class: 'deploy-key-form form-horizontal js-requires-input' } do |f| -if @key.errors.any? .alert.alert-danger %ul - @key.errors.full_messages.each do |msg| %li= msg .form-group = f.label :title, class: "control-label" .col-sm-10= f.text_field :title, class: 'form-control', autofocus: true, required: true .form-group = f.label :key, class: "control-label" .col-sm-10 %p.light Paste a machine public key here. Read more about how to generate it = link_to "here", help_page_path("ssh", "README") = f.text_area :key, class: "form-control thin_area", rows: 5, required: true .form-actions = f.submit 'Create Deploy Key', class: "btn-create btn" = link_to "Cancel", namespace_project_deploy_keys_path(@project.namespace, @project), class: "btn btn-cancel" ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/_deploy_key.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/deploy_keys/_deploy_key0000644000175600017570000000252212672631600031135 0ustar pravipravi%li .pull-right - if @available_keys.include?(deploy_key) = link_to enable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-sm', method: :put do = icon('plus') Enable - else - if deploy_key.destroyed_when_orphaned? && deploy_key.almost_orphaned? = link_to 'Remove', disable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), data: { confirm: 'You are going to remove deploy key. Are you sure?'}, method: :put, class: "btn btn-remove delete-key btn-sm pull-right" - else = link_to disable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-sm', method: :put do = icon('power-off') Disable = icon('key') %strong= deploy_key.title %br %code.key-fingerprint= deploy_key.fingerprint %p.light.prepend-top-10 - if deploy_key.public? %span.label.label-info.deploy-project-label Public deploy key - deploy_key.projects.each do |project| - if can?(current_user, :read_project, project) %span.label.label-gray.deploy-project-label = link_to namespace_project_path(project.namespace, project) do = project.name_with_namespace %small.pull-right Created #{time_ago_with_tooltip(deploy_key.created_at)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_readme.html.haml0000644000175600017570000000167612672631600027573 0ustar pravipravi- if readme = @repository.readme %article.readme-holder .pull-right - if can?(current_user, :push_code, @project) = link_to icon('pencil'), namespace_project_edit_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)), class: 'light edit-project-readme' .file-content.wiki = cache(readme_cache_key) do = render_readme(readme) - else .gray-content-block.second-block.center %h3.page-title This project does not have README yet - if can?(current_user, :push_code, @project) %p A %code README file contains information about other files in a repository and is commonly distributed with computer software, forming part of its documentation. %p We recommend you to = link_to "add README", new_readme_path, class: 'underlined-link' file to the repository and GitLab will render it here instead of this message. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/imports/0000755000175600017570000000000012672631600026054 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/imports/new.html.haml0000644000175600017570000000103612672631600030453 0ustar pravipravi- page_title "Import repository" %h3.page-title Import repository %hr - if @project.import_failed? .panel.panel-danger .panel-heading The repository could not be imported. .panel-body %pre :preserve #{@project.import_error.try(:strip)} = form_for @project, url: namespace_project_import_path(@project.namespace, @project), method: :post, html: { class: 'form-horizontal' } do |f| = render "shared/import_form", f: f .form-actions = f.submit 'Start import', class: "btn btn-create", tabindex: 4 gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/imports/show.html.haml0000644000175600017570000000063712672631600030650 0ustar pravipravi- page_title "Import in progress" .save-project-loader .center %h2 %i.fa.fa-spinner.fa-spin - if @project.forked? Forking in progress. - else Import in progress. - unless @project.forked? %p.monospace git clone --bare #{@project.safe_import_url} %p Please wait while we import the repository for you. Refresh at will. :javascript new ProjectImport(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/triggers/0000755000175600017570000000000012672631600026205 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/triggers/_trigger.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/triggers/_trigger.html.0000644000175600017570000000064012672631600030753 0ustar pravipravi%tr %td .clearfix %span.monospace= trigger.token %td - if trigger.last_trigger_request #{time_ago_in_words(trigger.last_trigger_request.created_at)} ago - else Never %td .pull-right = link_to 'Revoke', namespace_project_trigger_path(@project.namespace, @project, trigger), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-danger btn-sm btn-grouped" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/triggers/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/triggers/index.html.ham0000644000175600017570000000315012672631600030745 0ustar pravipravi- page_title "Triggers" %h3.page-title Triggers %p.light Triggers can be used to force a rebuild of a specific branch or tag with an API call. %hr.clearfix -if @triggers.any? .table-holder %table.table %thead %th Token %th Last used %th = render partial: 'trigger', collection: @triggers, as: :trigger - else %h4 No triggers = form_for @trigger, url: url_for(controller: 'projects/triggers', action: 'create'), html: { class: 'form-horizontal' } do |f| .clearfix = f.submit "Add Trigger", class: 'btn btn-success pull-right' %hr.clearfix -if @triggers.any? %h3 Use CURL %p.light Copy the token above and set your branch or tag name. This is the reference that will be rebuild. %pre :plain curl -X POST \ -F token=TOKEN \ -F ref=REF_NAME \ #{builds_trigger_url(@project.id)} %h3 Use .gitlab-ci.yml %p.light Copy the snippet to %i .gitlab-ci.yml of dependent project. At the end of your build it will trigger this project to rebuilt. %pre :plain trigger: type: deploy script: - "curl -X POST -F token=TOKEN -F ref=REF_NAME #{builds_trigger_url(@project.id)}" %h3 Pass build variables %p.light Add %strong variables[VARIABLE]=VALUE to API request. The value of variable could then be used to distinguish triggered build from normal one. %pre :plain curl -X POST \ -F token=TOKEN \ -F "ref=REF_NAME" \ -F "variables[RUN_NIGHTLY_BUILD]=true" \ #{builds_trigger_url(@project.id)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/0000755000175600017570000000000012672631600026337 5ustar pravipravi././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/_tree_directory.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/_tree_directo0000644000175600017570000000051512672631600031072 0ustar pravipravi- path_to_directory = browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path: directory.path) %tr.tree-item{ 'data-link' => path_to_directory} %td.tree-item-file-name = tree_icon('folder', '755', directory.name) %span.str-truncated = link_to directory.name, path_to_directory %td ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/_tree_file.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/_tree_file.ht0000644000175600017570000000055312672631600030774 0ustar pravipravi- path_to_file = file_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path: file.path) %tr.tree-item{ 'data-link' => path_to_file } %td.tree-item-file-name = tree_icon('file', '664', file.name) %span.str-truncated = link_to file.name, path_to_file %td = number_to_human_size(file.metadata[:size], precision: 2) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/browse.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/artifacts/browse.html.h0000644000175600017570000000130512672631600030753 0ustar pravipravi- page_title 'Artifacts', "#{@build.name} (##{@build.id})", 'Builds' = render 'projects/builds/header_title' .top-block.gray-content-block.clearfix .pull-right = link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-default download' do = icon('download') Download artifacts archive .tree-holder %div.tree-content-holder %table.table.tree-table %thead %tr %th Name %th Size = render partial: 'tree_directory', collection: @entry.directories(parent: true), as: :directory = render partial: 'tree_file', collection: @entry.files, as: :file - if @entry.empty? .center Empty gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/update.js.haml0000644000175600017570000000052212672631600027116 0ustar pravipravi- if @project.valid? :plain location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; - else :plain $(".project-edit-errors").html("#{escape_javascript(render('errors'))}"); $('.save-project-loader').hide(); $('.project-edit-container').show(); $('.project-edit-content .btn-save').enable(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/repositories/0000755000175600017570000000000012672631600027106 5ustar pravipravi././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/repositories/_download_archive.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/repositories/_download_0000644000175600017570000000336212672631600031142 0ustar pravipravi- ref = ref || nil - btn_class = btn_class || '' - split_button = split_button || false - if split_button == true %span.btn-group{class: btn_class} = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn col-xs-10', rel: 'nofollow' do %i.fa.fa-download %span Download zip %a.col-xs-2.btn.dropdown-toggle{ 'data-toggle' => 'dropdown' } %span.caret %span.sr-only Select Archive Format %ul.col-xs-10.dropdown-menu{ role: 'menu' } %li = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), rel: 'nofollow' do %i.fa.fa-download %span Download zip %li = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), rel: 'nofollow' do %i.fa.fa-download %span Download tar.gz %li = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.bz2'), rel: 'nofollow' do %i.fa.fa-download %span Download tar.bz2 %li = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar'), rel: 'nofollow' do %i.fa.fa-download %span Download tar - else %span.btn-group{class: btn_class} = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do %i.fa.fa-download %span zip = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), class: 'btn', rel: 'nofollow' do %i.fa.fa-download %span tar.gz ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/repositories/_feed.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/repositories/_feed.html0000644000175600017570000000117412672631600031041 0ustar pravipravi- commit = update %tr %td = link_to namespace_project_commits_path(@project.namespace, @project, commit.head.name) do %strong = commit.head.name - if @project.root_ref?(commit.head.name) %span.label default %td %div = link_to namespace_project_commits_path(@project.namespace, @project, commit.id) do %code= commit.short_id = image_tag avatar_icon(commit.author_email), class: "", width: 16, alt: '' = markdown escape_once(truncate(commit.title, length: 40)), pipeline: :single_line %td %span.pull-right.cgray = time_ago_with_tooltip(commit.committed_date) ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_bitbucket_import_modal.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_bitbucket_import_modal0000644000175600017570000000076212672631600031170 0ustar pravipravi%div#bitbucket_import_modal.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from Bitbucket .modal-body To enable importing projects from Bitbucket, - if current_user.admin? as administrator you need to configure - else ask your GitLab administrator to configure == #{link_to 'OAuth integration', help_page_path("integration", "bitbucket")}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/protected_branches/0000755000175600017570000000000012672631600030215 5ustar pravipravi././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/protected_branches/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/protected_branches/inde0000644000175600017570000000274512672631600031067 0ustar pravipravi- page_title "Protected branches" %h3.page-title Protected branches %p.light Keep stable branches secure and force developers to use Merge Requests %hr .well %p Protected branches are designed to %ul %li prevent pushes from everybody except #{link_to "masters", help_page_path("permissions", "permissions"), class: "vlink"} %li prevent anyone from force pushing to the branch %li prevent anyone from deleting the branch %p Read more about #{link_to "project permissions", help_page_path("permissions", "permissions"), class: "underlined-link"} - if can? current_user, :admin_project, @project = form_for [@project.namespace.becomes(Namespace), @project, @protected_branch], html: { class: 'form-horizontal' } do |f| -if @protected_branch.errors.any? .alert.alert-danger %ul - @protected_branch.errors.full_messages.each do |msg| %li= msg .form-group = f.label :name, "Branch", class: 'control-label' .col-sm-10 = f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: true}, {class: "select2", data: {placeholder: "Select branch"}}) .form-group .col-sm-offset-2.col-sm-10 .checkbox = f.label :developers_can_push do = f.check_box :developers_can_push %strong Developers can push .help-block Allow developers to push to this branch .form-actions = f.submit 'Protect', class: "btn-create btn" = render 'branches_list' ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/protected_branches/_branches_list.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/protected_branches/_bra0000644000175600017570000000277312672631600031054 0ustar pravipravi- unless @branches.empty? %br %h4 Already Protected: .table-holder %table.table.protected-branches-list %thead %tr.no-border %th Branch %th Developers can push %th Last commit %th %tbody - @branches.each do |branch| - @url = namespace_project_protected_branch_path(@project.namespace, @project, branch) %tr %td = link_to namespace_project_commits_path(@project.namespace, @project, branch.name) do %strong= branch.name - if @project.root_ref?(branch.name) %span.label.label-info default %td = check_box_tag "developers_can_push", branch.id, branch.developers_can_push, "data-url" => @url %td - if commit = branch.commit = link_to namespace_project_commit_path(@project.namespace, @project, commit.id), class: 'commit_short_id' do = commit.short_id · #{time_ago_with_tooltip(commit.committed_date)} - else (branch was removed from repository) %td .pull-right - if can? current_user, :admin_project, @project = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-sm" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/variables/0000755000175600017570000000000012672631600026327 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/variables/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/variables/show.html.ham0000644000175600017570000000270412672631600030744 0ustar pravipravi- page_title "Variables" %h3.page-title Secret Variables %p.light These variables will be set to environment by the runner. %br So you can use them for passwords, secret keys or whatever you want. %br The value of the variable can be visible in build log if explicitly asked to do so. %hr = nested_form_for @project, url: url_for(controller: 'projects/variables', action: 'update'), html: { class: 'form-horizontal' } do |f| - if @project.errors.any? #error_explanation %p.lead= "#{pluralize(@project.errors.count, "error")} prohibited this project from being saved:" .alert.alert-error %ul - @project.errors.full_messages.each do |msg| %li= msg = f.fields_for :variables do |variable_form| .form-group = variable_form.label :key, 'Key', class: 'control-label' .col-sm-10 = variable_form.text_field :key, class: 'form-control', placeholder: "PROJECT_VARIABLE" .form-group = variable_form.label :value, 'Value', class: 'control-label' .col-sm-10 = variable_form.text_area :value, class: 'form-control', rows: 2, placeholder: "" = variable_form.link_to_remove "Remove this variable", class: 'btn btn-danger pull-right prepend-top-10' %hr %p .clearfix = f.link_to_add "Add a variable", :variables, class: 'btn btn-success pull-right' .form-actions = f.submit 'Save changes', class: 'btn btn-save', return_to: request.original_url gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/remove_fork.js.haml0000644000175600017570000000013312672631600030150 0ustar pravipravi:plain location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/0000755000175600017570000000000012672631600025452 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_diffs.html.haml0000644000175600017570000000162212672631600030513 0ustar pravipravi- if diff_view == 'parallel' - fluid_layout true - diff_files = safe_diff_files(diffs, diff_refs) .content-block.oneline-block .inline-parallel-buttons .btn-group = inline_diff_btn = parallel_diff_btn = render 'projects/diffs/stats', diff_files: diff_files - if diff_files.count < diffs.size = render 'projects/diffs/warning', diffs: diffs, shown_files_count: diff_files.count .files - diff_files.each_with_index do |diff_file, index| - diff_commit = commit_for_diff(diff_file) - blob = project.repository.blob_for_diff(diff_commit, diff_file) - next unless blob = render 'projects/diffs/file', i: index, project: project, diff_file: diff_file, diff_commit: diff_commit, blob: blob - if @diff_timeout .alert.alert-danger %h4 Failed to collect changes %p Maybe diff is really big and operation failed with timeout. Try to get diff locally ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_text_file.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_text_file.html.h0000644000175600017570000000401512672631600030710 0ustar pravipravi- too_big = diff_file.diff_lines.count > Commit::DIFF_SAFE_LINES - if too_big .suppressed-container %a.show-suppressed-diff.js-show-suppressed-diff Changes suppressed. Click to show. %table.text-file.code.js-syntax-highlight{ class: too_big ? 'hide' : '' } - last_line = 0 - raw_diff_lines = diff_file.diff_lines - diff_file.highlighted_diff_lines.each_with_index do |line, index| - type = line.type - last_line = line.new_pos - line_code = generate_line_code(diff_file.file_path, line) - line_old = line.old_pos %tr.line_holder{ id: line_code, class: "#{type}" } - if type == "match" = render "projects/diffs/match_line", {line: line.text, line_old: line_old, line_new: line.new_pos, bottom: false, new_file: diff_file.new_file} - elsif type == 'nonewline' %td.old_line.diff-line-num %td.new_line.diff-line-num %td.line_content.match= line.text - else %td.old_line.diff-line-num{class: type} = link_to raw(type == "new" ? " " : line_old), "##{line_code}", id: line_code - if @comments_allowed && can?(current_user, :create_note, @project) = link_to_new_diff_note(line_code) %td.new_line.diff-line-num{class: type, data: {linenumber: line.new_pos}} = link_to raw(type == "old" ? " " : line.new_pos), "##{line_code}", id: line_code %td.line_content{class: "noteable_line #{type} #{line_code}", data: { line_code: line_code }}= diff_line_content(line.text) - if @reply_allowed - comments = @line_notes.select { |n| n.line_code == line_code && n.active? }.sort_by(&:created_at) - unless comments.empty? = render "projects/notes/diff_notes_with_reply", notes: comments, line: raw_diff_lines[index].text - if last_line > 0 = render "projects/diffs/match_line", { line: "", line_old: last_line, line_new: last_line, bottom: true, new_file: diff_file.new_file } - if diff_file.diff.blank? && diff_file.mode_changed? .file-mode-changed File mode changed ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_match_line_parallel.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_match_line_paral0000644000175600017570000000020212672631600031010 0ustar pravipravi%td.old_line.diff-line-num %td.line_content.parallel.match= line %td.new_line.diff-line-num %td.line_content.parallel.match= line ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_parallel_view.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_parallel_view.ht0000644000175600017570000000441412672631600030777 0ustar pravipravi/ Side-by-side diff view %div.text-file.diff-wrap-lines.code.file-content.js-syntax-highlight %table - diff_file.parallel_diff_lines.each do |line| - left = line[:left] - right = line[:right] %tr.line_holder.parallel - if left[:type] == 'match' = render "projects/diffs/match_line_parallel", { line: left[:text], line_old: left[:number], line_new: right[:number] } - elsif left[:type] == 'nonewline' %td.old_line.diff-line-num %td.line_content.parallel.match= left[:text] %td.new_line.diff-line-num %td.line_content.parallel.match= left[:text] - else %td.old_line.diff-line-num{id: left[:line_code], class: "#{left[:type]}"} = link_to raw(left[:number]), "##{left[:line_code]}", id: left[:line_code] - if @comments_allowed && can?(current_user, :create_note, @project) = link_to_new_diff_note(left[:line_code], 'old') %td.line_content{class: "parallel noteable_line #{left[:type]} #{left[:line_code]}", data: { line_code: left[:line_code] }}= diff_line_content(left[:text]) - if right[:type] == 'new' - new_line_class = 'new' - new_line_code = right[:line_code] - else - new_line_class = nil - new_line_code = left[:line_code] %td.new_line.diff-line-num{id: new_line_code, class: "#{new_line_class}", data: { linenumber: right[:number] }} = link_to raw(right[:number]), "##{new_line_code}", id: new_line_code - if @comments_allowed && can?(current_user, :create_note, @project) = link_to_new_diff_note(right[:line_code], 'new') %td.line_content.parallel{class: "noteable_line #{new_line_class} #{new_line_code}", data: { line_code: new_line_code }}= diff_line_content(right[:text]) - if @reply_allowed - comments_left, comments_right = organize_comments(left[:type], right[:type], left[:line_code], right[:line_code]) - if comments_left.present? || comments_right.present? = render "projects/notes/diff_notes_with_reply_parallel", notes_left: comments_left, notes_right: comments_right - if diff_file.diff.diff.blank? && diff_file.mode_changed? .file-mode-changed File mode changed gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_file.html.haml0000644000175600017570000000403712672631600030342 0ustar pravipravi.diff-file.file-holder{id: "diff-#{i}", data: diff_file_html_data(project, diff_commit, diff_file)} .file-title{id: "file-path-#{hexdigest(diff_file.file_path)}"} - if diff_file.diff.submodule? %span = icon('archive fw') %strong = submodule_link(blob, @commit.id, project.repository) - else = blob_icon blob.mode, blob.name = link_to "#diff-#{i}" do - if diff_file.renamed_file - old_path, new_path = mark_inline_diffs(diff_file.old_path, diff_file.new_path) %strong.filename.old = old_path → %strong.filename.new = new_path - else %strong = diff_file.new_path - if diff_file.deleted_file deleted - if diff_file.mode_changed? %small = "#{diff_file.diff.a_mode} → #{diff_file.diff.b_mode}" .file-actions.hidden-xs - if blob_text_viewable?(blob) = link_to '#', class: 'js-toggle-diff-comments btn active has_tooltip', title: "Toggle comments for this file" do = icon('comments') \ - if editable_diff?(diff_file) = edit_blob_link(@merge_request.source_project, @merge_request.source_branch, diff_file.new_path, from_merge_request_id: @merge_request.id) = view_file_btn(diff_commit.id, diff_file, project) .diff-content.diff-wrap-lines -# Skipp all non non-supported blobs - return unless blob.respond_to?('text?') - if blob_text_viewable?(blob) - if diff_view == 'parallel' = render "projects/diffs/parallel_view", diff_file: diff_file, project: project, blob: blob, index: i - else = render "projects/diffs/text_file", diff_file: diff_file, index: i - elsif blob.image? - old_file = project.repository.prev_blob_for_diff(diff_commit, diff_file) = render "projects/diffs/image", diff_file: diff_file, old_file: old_file, file: blob, index: i - else .nothing-here-block No preview for this file type ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_warning.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_warning.html.ham0000644000175600017570000000207412672631600030713 0ustar pravipravi.alert.alert-warning %h4 Too many changes to show. .pull-right - unless diff_hard_limit_enabled? = link_to "Reload with full diff", url_for(params.merge(force_show_diff: true, format: nil)), class: "btn btn-sm btn-warning" - if current_controller?(:commit) or current_controller?(:merge_requests) - if current_controller?(:commit) = link_to "Plain diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff), class: "btn btn-warning btn-sm" = link_to "Email patch", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch), class: "btn btn-warning btn-sm" - elsif @merge_request && @merge_request.persisted? = link_to "Plain diff", merge_request_path(@merge_request, format: :diff), class: "btn btn-warning btn-sm" = link_to "Email patch", merge_request_path(@merge_request, format: :patch), class: "btn btn-warning btn-sm" %p To preserve performance only %strong #{shown_files_count} of #{diffs.size} files are displayed. ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_match_line.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_match_line.html.0000644000175600017570000000043512672631600030662 0ustar pravipravi%td.old_line.diff-line-num{data: {linenumber: line_old}, class: [unfold_bottom_class(bottom), unfold_class(!new_file)]} \... %td.new_line.diff-line-num{data: {linenumber: line_new}, class: [unfold_bottom_class(bottom), unfold_class(!new_file)]} \... %td.line_content.match= line gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_stats.html.haml0000644000175600017570000000217312672631600030560 0ustar pravipravi.js-toggle-container .commit-stat-summary Showing = link_to '#', class: 'js-toggle-button' do %strong #{pluralize(diff_files.count, "changed file")} with %strong.cgreen #{diff_files.sum(&:added_lines)} additions and %strong.cred #{diff_files.sum(&:removed_lines)} deletions .file-stats.js-toggle-content.hide %ul - diff_files.each_with_index do |diff_file, i| %li - if diff_file.deleted_file %span.deleted-file %a{href: "#diff-#{i}"} %i.fa.fa-minus = diff_file.old_path - elsif diff_file.renamed_file %span.renamed-file %a{href: "#diff-#{i}"} %i.fa.fa-minus = diff_file.old_path → = diff_file.new_path - elsif diff_file.new_file %span.new-file %a{href: "#diff-#{i}"} %i.fa.fa-plus = diff_file.new_path - else %span.edit-file %a{href: "#diff-#{i}"} %i.fa.fa-adjust = diff_file.new_path gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/diffs/_image.html.haml0000644000175600017570000000412112672631600030477 0ustar pravipravi- diff = diff_file.diff - file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path)) - old_file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path)) - if diff.renamed_file || diff.new_file || diff.deleted_file .image %span.wrap .frame{class: image_diff_class(diff)} %img{src: diff.deleted_file ? old_file_raw_path : file_raw_path} %p.image-info= "#{number_to_human_size file.size}" - else .image %div.two-up.view %span.wrap .frame.deleted %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path))} %img{src: old_file_raw_path} %p.image-info.hide %span.meta-filesize= "#{number_to_human_size old_file.size}" | %b W: %span.meta-width | %b H: %span.meta-height %span.wrap .frame.added %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))} %img{src: file_raw_path} %p.image-info.hide %span.meta-filesize= "#{number_to_human_size file.size}" | %b W: %span.meta-width | %b H: %span.meta-height %div.swipe.view.hide .swipe-frame .frame.deleted %img{src: old_file_raw_path} .swipe-wrap .frame.added %img{src: file_raw_path} %span.swipe-bar %span.top-handle %span.bottom-handle %div.onion-skin.view.hide .onion-skin-frame .frame.deleted %img{src: old_file_raw_path} .frame.added %img{src: file_raw_path} .controls .transparent .drag-track .dragger{:style => "left: 0px;"} .opaque .view-modes.hide %ul.view-modes-menu %li.two-up{data: {mode: 'two-up'}} 2-up %li.swipe{data: {mode: 'swipe'}} Swipe %li.onion-skin{data: {mode: 'onion-skin'}} Onion skin ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_find_file_link.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_find_file_link.html.ha0000644000175600017570000000027112672631600030727 0ustar pravipravi= link_to namespace_project_find_file_path(@project.namespace, @project, @ref), class: 'btn btn-grouped shortcuts-find-file', rel: 'nofollow' do = icon('search') %span Find File gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_home_panel.html.haml0000644000175600017570000000446212672631600030441 0ustar pravipravi- empty_repo = @project.empty_repo? .project-home-panel.cover-block.clearfix{:class => ("empty-project" if empty_repo)} .project-identicon-holder = project_icon(@project, alt: '', class: 'project-avatar avatar s90') .project-home-desc %h1 = @project.name %span.visibility-icon.has_tooltip{data: { container: 'body' }, title: "#{visibility_level_label(@project.visibility_level)} - #{project_visibility_level_description(@project.visibility_level)}"} = visibility_level_icon(@project.visibility_level, fw: false) - if @project.description.present? = markdown(@project.description, pipeline: :description) - if forked_from_project = @project.forked_from_project %p Forked from = link_to project_path(forked_from_project) do = forked_from_project.namespace.try(:name) .cover-controls - if current_user = link_to namespace_project_path(@project.namespace, @project, format: :atom, private_token: current_user.private_token), class: 'btn btn-gray' do = icon('rss') - access = user_max_access_in_project(current_user.id, @project) - can_edit = can?(current_user, :admin_project, @project) - if access || can_edit %span.dropdown.project-settings-dropdown %a.dropdown-new.btn.btn-gray#project-settings-button{href: '#', 'data-toggle' => 'dropdown'} = icon('cog') = icon('angle-down') %ul.dropdown-menu.dropdown-menu-right - if can_edit %li = link_to edit_project_path(@project) do Edit Project - if access %li = link_to leave_namespace_project_project_members_path(@project.namespace, @project), data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project' do Leave Project .project-repo-buttons .split-one.count-buttons = render 'projects/buttons/star' = render 'projects/buttons/fork' .clone-row .project-clone-holder = render "shared/clone_panel" .split-repo-buttons .btn-group.pull-left = render "projects/buttons/download" = render 'projects/buttons/dropdown' = render 'projects/buttons/notifications' :javascript new Star(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/find_file/0000755000175600017570000000000012672631600026276 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/find_file/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/find_file/show.html.ham0000644000175600017570000000232712672631600030714 0ustar pravipravi- page_title "Find File", @ref - header_title project_title(@project, "Files", project_files_path(@project)) .file-finder-holder.tree-holder.clearfix .gray-content-block.top-block .tree-ref-holder = render 'shared/ref_switcher', destination: 'find_file', path: @path %ul.breadcrumb.repo-breadcrumb %li = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = @project.path %li.file-finder %input#file_find.form-control.file-finder-input{type: "text", placeholder: 'Find by path', autocomplete: 'off'} %div.tree-content-holder .table-holder %table.table.files-slider{class: "table_#{@hex_path} tree-table table-striped" } %tbody = spinner nil, true :javascript var projectFindFile = new ProjectFindFile($(".file-finder-holder"), { url: "#{escape_javascript(namespace_project_files_path(@project.namespace, @project, @ref, @options.merge(format: :json)))}", treeUrl: "#{escape_javascript(namespace_project_tree_path(@project.namespace, @project, @ref))}", blobUrlTemplate: "#{escape_javascript(namespace_project_blob_path(@project.namespace, @project, @id || @commit.id))}" }); new ShortcutsFindFile(projectFindFile); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/activity.html.haml0000644000175600017570000000025112672631600030017 0ustar pravipravi- page_title "Activity" - header_title project_title(@project, "Activity", activity_project_path(@project)) = render 'projects/last_push' = render 'projects/activity' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/go_import.html.haml0000644000175600017570000000026112672631600030163 0ustar pravipravi!!! 5 %html %head - web_url = [Gitlab.config.gitlab.url, @namespace, @id].join('/') %meta{name: "go-import", content: "#{web_url.split('://')[1]} git #{web_url}.git"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/empty.html.haml0000644000175600017570000000377612672631600027340 0ustar pravipravi- @no_container = true = content_for :flash_message do - if current_user && can?(current_user, :download_code, @project) = render 'shared/no_ssh' = render 'shared/no_password' = render "home_panel" .gray-content-block.second-block.center %h3.page-title The repository for this project is empty - if can?(current_user, :push_code, @project) %p If you already have files you can push them using command line instructions below. %p Otherwise you can start with = link_to "adding README", new_readme_path, class: 'underlined-link' file to this project. - if can?(current_user, :download_code, @project) %div{ class: container_class } .prepend-top-20 .empty_wrapper %h3.page-title-empty Command line instructions %div.git-empty %fieldset %h5 Git global setup %pre.light-well :preserve git config --global user.name "#{h git_user_name}" git config --global user.email "#{h git_user_email}" %fieldset %h5 Create a new repository %pre.light-well :preserve git clone #{ content_tag(:span, default_url_to_repo, class: 'clone')} cd #{h @project.path} touch README.md git add README.md git commit -m "add README" git push -u origin master %fieldset %h5 Existing folder or Git repository %pre.light-well :preserve cd existing_folder git init git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'clone')} git add . git commit git push -u origin master - if can? current_user, :remove_project, @project .prepend-top-20 = link_to 'Remove project', [@project.namespace.becomes(Namespace), @project], data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_commit_button.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_commit_button.html.ham0000644000175600017570000000047412672631600031040 0ustar pravipravi.form-actions = button_tag 'Commit Changes', class: 'btn commit-btn js-commit-button btn-create' = link_to 'Cancel', cancel_path, class: 'btn btn-cancel', data: {confirm: leave_edit_message} - unless can?(current_user, :push_code, @project) .inline.prepend-left-10 = commit_in_fork_help gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/0000755000175600017570000000000012672631600025316 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_header.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_header.html.0000644000175600017570000000745012672631600030676 0ustar pravipravi.tree-ref-holder = render 'shared/ref_switcher', destination: 'tree', path: @path %ul.breadcrumb.repo-breadcrumb %li = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = @project.path - tree_breadcrumbs(tree, 6) do |title, path| %li - if path = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - else = link_to title, '#' - if current_user %li - if !on_top_of_branch? %span.btn.btn-sm.add-to-tree.disabled.has_tooltip{title: "You can only add files when you are on a branch", data: { container: 'body' }} = icon('plus') - else %span.dropdown %a.dropdown-toggle.btn.btn-sm.add-to-tree{href: '#', "data-toggle" => "dropdown"} = icon('plus') %ul.dropdown-menu - if can_edit_tree? %li = link_to namespace_project_new_blob_path(@project.namespace, @project, @id) do = icon('pencil fw') New file %li = link_to '#modal-upload-blob', { 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'} do = icon('file fw') Upload file %li = link_to '#modal-create-new-dir', { 'data-target' => '#modal-create-new-dir', 'data-toggle' => 'modal'} do = icon('folder fw') New directory - elsif can?(current_user, :fork_project, @project) %li - continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @id), notice: edit_in_new_fork_notice, notice_now: edit_in_new_fork_notice_now } - fork_path = namespace_project_forks_path(@project.namespace, @project, namespace_key: current_user.namespace.id, continue: continue_params) = link_to fork_path, method: :post do = icon('pencil fw') New file %li - continue_params = { to: request.fullpath, notice: edit_in_new_fork_notice + " Try to upload a file again.", notice_now: edit_in_new_fork_notice_now } - fork_path = namespace_project_forks_path(@project.namespace, @project, namespace_key: current_user.namespace.id, continue: continue_params) = link_to fork_path, method: :post do = icon('file fw') Upload file %li - continue_params = { to: request.fullpath, notice: edit_in_new_fork_notice + " Try to create a new directory again.", notice_now: edit_in_new_fork_notice_now } - fork_path = namespace_project_forks_path(@project.namespace, @project, namespace_key: current_user.namespace.id, continue: continue_params) = link_to fork_path, method: :post do = icon('folder fw') New directory %li.divider %li = link_to new_namespace_project_branch_path(@project.namespace, @project) do = icon('code-fork fw') New branch %li = link_to new_namespace_project_tag_path(@project.namespace, @project) do = icon('tags fw') New tag ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_content.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_content.html0000644000175600017570000000274312672631600031042 0ustar pravipravi%div.tree-content-holder .table-holder %table.table#tree-slider{class: "table_#{@hex_path} tree-table" } %thead %tr %th Name %th Last Update %th.hidden-xs .pull-left Last Commit .last-commit.hidden-sm.pull-left   %i.fa.fa-angle-right   %small.light = link_to @commit.short_id, namespace_project_commit_path(@project.namespace, @project, @commit), class: "monospace" – = truncate(@commit.title, length: 50) = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'pull-right' - if @path.present? %tr.tree-item %td.tree-item-file-name = link_to "..", namespace_project_tree_path(@project.namespace, @project, up_dir_path), class: 'prepend-left-10' %td %td.hidden-xs = render_tree(tree) - if tree.readme = render "projects/tree/readme", readme: tree.readme - if can_edit_tree? = render 'projects/blob/upload', title: 'Upload New File', placeholder: 'Upload new file', button_title: 'Upload file', form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post = render 'projects/blob/new_dir' :javascript // Load last commit log for each file in tree $('#tree-slider').waitForImages(function() { ajaxGet("#{escape_javascript(@logs_path)}"); }); ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_commit_column.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_commit_colum0000644000175600017570000000022412672631600031104 0ustar pravipravi%span.str-truncated = link_to_gfm commit.title, namespace_project_commit_path(@project.namespace, @project, commit.id), class: "tree-commit-link" ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_submodule_item.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_submodule_item.ht0000644000175600017570000000022012672631600031021 0ustar pravipravi%tr{ class: "tree-item" } %td.tree-item-file-name %i.fa.fa-archive.fa-fw = submodule_link(submodule_item, @ref) %td %td.hidden-xs ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_blob_item.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_blob_item.html.ha0000644000175600017570000000060212672631600030664 0ustar pravipravi%tr{ class: "tree-item #{tree_hex_class(blob_item)}" } %td.tree-item-file-name = tree_icon(type, blob_item.mode, blob_item.name) %span.str-truncated = link_to blob_item.name, namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)) %td.tree_time_ago.cgray = render 'projects/tree/spinner' %td.hidden-xs.tree_commit gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_readme.html.haml0000644000175600017570000000045712672631600030526 0ustar pravipravi%article.file-holder.readme-holder .file-title = blob_icon readme.mode, readme.name = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, @path, readme.name)) do %strong = readme.name .file-content.wiki = render_readme(readme) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_spinner.html.haml0000644000175600017570000000011312672631600030734 0ustar pravipravi%span.log_loading.hide %i.fa.fa-spinner.fa-spin Loading commit data... ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_item.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/_tree_item.html.ha0000644000175600017570000000062512672631600030712 0ustar pravipravi%tr{ class: "tree-item #{tree_hex_class(tree_item)}" } %td.tree-item-file-name = tree_icon(type, tree_item.mode, tree_item.name) %span.str-truncated - path = flatten_tree(tree_item) = link_to path, namespace_project_tree_path(@project.namespace, @project, tree_join(@id || @commit.id, path)) %td.tree_time_ago.cgray = render 'projects/tree/spinner' %td.hidden-xs.tree_commit gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/tree/show.html.haml0000644000175600017570000000143512672631600030107 0ustar pravipravi- page_title @path.presence || "Files", @ref - header_title project_title(@project, "Files", project_files_path(@project)) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "#{@project.name}:#{@ref} commits") = render 'projects/last_push' .tree-controls = render 'projects/find_file_link' - if can? current_user, :download_code, @project = render 'projects/repositories/download_archive', ref: @ref, btn_class: 'hidden-xs hidden-sm btn-grouped', split_button: true #tree-holder.tree-holder.clearfix .nav-block = render 'projects/tree/tree_header', tree: @tree = render 'projects/tree/tree_content', tree: @tree gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/compare/0000755000175600017570000000000012672631600026005 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/compare/index.html.haml0000644000175600017570000000076512672631600030732 0ustar pravipravi- page_title "Compare" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block Compare branches, tags or commit ranges. %br Fill input field with commit id like %code.label-branch 4eedf23 or branch/tag name like %code.label-branch master and press compare button for the commits list and a code diff. %br Changes are shown from the version in the first field to the version in the second field. .prepend-top-20 = render "form" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/compare/_form.html.haml0000644000175600017570000000236712672631600030725 0ustar pravipravi= form_tag namespace_project_compare_index_path(@project.namespace, @project), method: :post, class: 'form-inline js-requires-input' do .clearfix - if params[:to] && params[:from] = link_to 'switch', {from: params[:to], to: params[:from]}, {class: 'commits-compare-switch has_tooltip', title: 'Switch base of comparison'} .form-group .input-group.inline-input-group %span.input-group-addon from = text_field_tag :from, params[:from], class: "form-control", required: true = "..." .form-group .input-group.inline-input-group %span.input-group-addon to = text_field_tag :to, params[:to], class: "form-control", required: true   = button_tag "Compare", class: "btn btn-create commits-compare-btn" - if @merge_request.present? = link_to "View Open Merge Request", namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: 'prepend-left-10 btn' - elsif create_mr_button? = link_to create_mr_path, class: 'prepend-left-10 btn' do = icon("plus") Create Merge Request :javascript var availableTags = #{@project.repository.ref_names.to_json}; $("#from, #to").autocomplete({ source: availableTags, minLength: 1 }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/compare/show.html.haml0000644000175600017570000000133212672631600030572 0ustar pravipravi- page_title "#{params[:from]}...#{params[:to]}" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block = render "form" - if @commits.present? .prepend-top-default = render "projects/commits/commit_list" = render "projects/diffs/diffs", diffs: @diffs, project: @project, diff_refs: @diff_refs - else .light-well.prepend-top-default .center %h4 There isn't anything to compare. %p.slead - if params[:to] == params[:from] %span.label-branch #{params[:from]} and %span.label-branch #{params[:to]} are the same. - else You'll need to use different branch names to get a valid comparison. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/0000755000175600017570000000000012672631600025672 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_issues.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_issues.html.ham0000644000175600017570000000026712672631600031003 0ustar pravipravi%ul.content-list.issues-list = render @issues - if @issues.blank? %li .nothing-here-block No issues to show - if @issues.present? = paginate @issues, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/edit.html.haml0000644000175600017570000000023312672631600030423 0ustar pravipravi- page_title "Edit", "#{@issue.title} (##{@issue.iid})", "Issues" = render "header_title" %h3.page-title Edit Issue ##{@issue.iid} %hr = render "form" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/new.html.haml0000644000175600017570000000014212672631600030266 0ustar pravipravi- page_title "New Issue" = render "header_title" %h3.page-title New Issue %hr = render "form" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_issue.html.haml0000644000175600017570000000371312672631600030773 0ustar pravipravi%li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue) } - if controller.controller_name == 'issues' && can?(current_user, :admin_issue, @project) .issue-check = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue" .issue-title %span.issue-title-text = link_to_gfm issue.title, issue_path(issue), class: "row_title" %ul.controls.light - if issue.closed? %li CLOSED - if issue.assignee %li = link_to_member(@project, issue.assignee, name: false, title: "Assigned to :name") - upvotes, downvotes = issue.upvotes, issue.downvotes - if upvotes > 0 %li = icon('thumbs-up') = upvotes - if downvotes > 0 %li = icon('thumbs-down') = downvotes - note_count = issue.notes.user.count - if note_count > 0 %li = link_to issue_path(issue) + "#notes" do = icon('comments') = note_count - else %li = link_to issue_path(issue) + "#notes", class: "issue-no-comments" do = icon('comments') = note_count .issue-info #{issue.to_reference} · opened #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} by #{link_to_member(@project, issue.author, avatar: false)} - if issue.milestone   = link_to namespace_project_issues_path(issue.project.namespace, issue.project, milestone_title: issue.milestone.title) do = icon('clock-o') = issue.milestone.title - if issue.labels.any?   - issue.labels.each do |label| = link_to_label(label, project: issue.project) - if issue.tasks?   %span.task-status = issue.task_status .pull-right.issue-updated-at %span updated #{time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago')} ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_header_title.ht0000644000175600017570000000015612672631600031021 0ustar pravipravi- header_title project_title(@project, "Issues", namespace_project_issues_path(@project.namespace, @project)) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/index.html.haml0000644000175600017570000000213712672631600030612 0ustar pravipravi- page_title "Issues" = render "header_title" = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_issues_url(@project.namespace, @project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") .top-area = render 'shared/issuable/nav', type: :issues .nav-controls - if current_user = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do = icon('rss') = render 'shared/issuable/search_form', path: namespace_project_issues_path(@project.namespace, @project) - if can? current_user, :create_issue, @project = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: @issuable_finder.assignee.try(:id), milestone_id: @issuable_finder.milestones.try(:first).try(:id) }), class: "btn btn-new", title: "New Issue", id: "new_issue_link" do = icon('plus') New Issue = render 'shared/issuable/filter', type: :issues .issues-holder = render "issues" ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_closed_by_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_closed_by_box.h0000644000175600017570000000047512672631600031023 0ustar pravipravi.issue-closed-by-widget.second-block - pluralized_mr_this = merge_request_count > 1 ? "these" : "this" - pluralized_mr_is = merge_request_count > 1 ? "are" : "is" When #{pluralized_mr_this} merge #{"request".pluralize(merge_request_count)} #{pluralized_mr_is} accepted, this issue will be closed automatically. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_form.html.haml0000644000175600017570000000056712672631600030612 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @issue], html: { class: 'form-horizontal issue-form gfm-form js-requires-input' } do |f| = render 'shared/issuable/form', f: f, issuable: @issue :javascript $('.assign-to-me-link').on('click', function(e){ $('#issue_assignee_id').val("#{current_user.id}").trigger("change"); e.preventDefault(); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/update.js.haml0000644000175600017570000000027112672631600030432 0ustar pravipravi$('aside.right-sidebar')[0].outerHTML = "#{escape_javascript(render 'shared/issuable/sidebar', issuable: @issue)}"; $('aside.right-sidebar').effect('highlight'); new IssuableContext(); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/index.atom.buildergitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/index.atom.build0000644000175600017570000000123012672631600030755 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@project.name} issues" xml.link href: namespace_project_issues_url(@project.namespace, @project, format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: namespace_project_issues_url(@project.namespace, @project), rel: "alternate", type: "text/html" xml.id namespace_project_issues_url(@project.namespace, @project) xml.updated @issues.first.created_at.xmlschema if @issues.any? @issues.each do |issue| issue_to_atom(xml, issue) end end ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_merge_requests.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_merge_requests.0000644000175600017570000000230012672631600031057 0ustar pravipravi-if @merge_requests.any? %h2.merge-requests-title = pluralize(@merge_requests.count, 'Related Merge Request') %ul.unstyled-list - has_any_ci = @merge_requests.any?(&:ci_commit) - @merge_requests.each do |merge_request| %li %span.merge-request-ci-status - if merge_request.ci_commit = render_ci_status(merge_request.ci_commit) - elsif has_any_ci = icon('blank fw') %span.merge-request-id \!#{merge_request.iid} %span.merge-request-info %strong = link_to_gfm merge_request.title, merge_request_path(merge_request), class: "row_title" - unless @issue.project.id == merge_request.target_project.id in - project = merge_request.target_project = link_to project.name_with_namespace, namespace_project_path(project.namespace, project) %span.merge-request-status.prepend-left-10 - if merge_request.merged? MERGED - elsif merge_request.closed? CLOSED - if @closed_by_merge_requests.present? = render partial: 'projects/issues/closed_by_box', locals: {merge_request_count: @merge_requests.count} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/show.html.haml0000644000175600017570000000531312672631600030462 0ustar pravipravi- page_title "#{@issue.title} (##{@issue.iid})", "Issues" - page_description @issue.description - page_card_attributes @issue.card_attributes = render "header_title" .issue .detail-page-header .pull-right - if can?(current_user, :create_issue, @project) = link_to new_namespace_project_issue_path(@project.namespace, @project), class: 'btn btn-nr btn-grouped new-issue-link btn-success', title: 'New Issue', id: 'new_issue_link' do = icon('plus') New Issue - if can?(current_user, :update_issue, @issue) = link_to 'Reopen', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen Issue' = link_to 'Close', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close #{issue_button_visibility(@issue, true)}", title: 'Close Issue' = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: 'btn btn-nr btn-grouped issuable-edit' do = icon('pencil-square-o') Edit .pull-left .status-box{ class: "status-box-closed #{issue_button_visibility(@issue, false)}"} Closed .status-box{ class: "status-box-open #{issue_button_visibility(@issue, true)}"} Open .issue-meta %span.identifier Issue ##{@issue.iid} %span.creator · by #{link_to_member(@project, @issue.author, size: 24)} · = time_ago_with_tooltip(@issue.created_at, placement: 'bottom', html_class: 'issue_created_ago') .issue-details.issuable-details .detail-page-description.content-block %h2.title = markdown escape_once(@issue.title), pipeline: :single_line %div - if @issue.description.present? .description{class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : ''} .wiki = preserve do = markdown(@issue.description, cache_key: [@issue, "description"]) %textarea.hidden.js-task-list-field = @issue.description - if @issue.updated_at != @issue.created_at %small Edited = time_ago_with_tooltip(@issue.updated_at, placement: 'bottom', html_class: 'issue_edited_ago') .merge-requests = render 'merge_requests' .content-block = render 'votes/votes_block', votable: @issue .row %section.col-md-12 .issuable-discussion = render 'projects/issues/discussion' = render 'shared/issuable/sidebar', issuable: @issue ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_discussion.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/issues/_discussion.html0000644000175600017570000000127212672631600031104 0ustar pravipravi- content_for :note_actions do - if can?(current_user, :update_issue, @issue) = link_to 'Reopen Issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen Issue' = link_to 'Close Issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close Issue' #notes = render 'projects/notes/notes_with_form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/0000755000175600017570000000000012672631600026032 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/show.atom.buildergitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/show.atom.build0000644000175600017570000000240012672631600030766 0ustar pravipravixml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@project.name}:#{@ref} commits" xml.link href: namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" xml.link href: namespace_project_commits_url(@project.namespace, @project, @ref), rel: "alternate", type: "text/html" xml.id namespace_project_commits_url(@project.namespace, @project, @ref) xml.updated @commits.first.committed_date.xmlschema if @commits.any? @commits.each do |commit| xml.entry do xml.id namespace_project_commit_url(@project.namespace, @project, id: commit.id) xml.link href: namespace_project_commit_url(@project.namespace, @project, id: commit.id) xml.title truncate(commit.title, length: 80) xml.updated commit.committed_date.xmlschema xml.media :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(commit.author_email)) xml.author do |author| xml.name commit.author_name xml.email commit.author_email end xml.summary markdown(commit.description, pipeline: :single_line) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_head.html.haml0000644000175600017570000000172512672631600030705 0ustar pravipravi%ul.nav-links = nav_link(controller: [:commit, :commits]) do = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do Commits %span.badge= number_with_delimiter(@repository.commit_count) = nav_link(controller: %w(network)) do = link_to namespace_project_network_path(@project.namespace, @project, current_ref) do Network = nav_link(controller: :compare) do = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do Compare = nav_link(html_options: {class: branches_tab_class}) do = link_to namespace_project_branches_path(@project.namespace, @project) do Branches %span.badge.js-totalbranch-count= @repository.branches.size = nav_link(controller: [:tags, :releases]) do = link_to namespace_project_tags_path(@project.namespace, @project) do Tags %span.badge.js-totaltags-count= @repository.tags.length ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_header_title.h0000644000175600017570000000012212672631600030766 0ustar pravipravi- header_title project_title(@project, "Commits", project_commits_path(@project)) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commits.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commits.html.h0000644000175600017570000000071312672631600030761 0ustar pravipravi- unless defined?(project) - project = @project - @commits.group_by { |c| c.committed_date.to_date }.sort.reverse.each do |day, commits| .row.commits-row .col-md-2.hidden-xs.hidden-sm %h5.commits-row-date %i.fa.fa-calendar %span= day.strftime('%d %b, %Y') .light = pluralize(commits.count, 'commit') .col-md-10.col-sm-12 %ul.bordered-list = render commits, project: project %hr.lists-separator ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commit.html.ha0000644000175600017570000000275112672631600030743 0ustar pravipravi- if @note_counts - note_count = @note_counts.fetch(commit.id, 0) - else - notes = commit.notes - note_count = notes.user.count - ci_commit = project.ci_commit(commit.sha) - cache_key = [project.path_with_namespace, commit.id, current_application_settings, note_count] - cache_key.push(ci_commit.status) if ci_commit = cache(cache_key) do %li.commit.js-toggle-container{ id: "commit-#{commit.short_id}" } .commit-row-title %span.item-title.str-truncated = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" - if commit.description? %a.text-expander.js-toggle-button ... .pull-right - if ci_commit = render_ci_status(ci_commit)   = clipboard_button(clipboard_text: commit.id) = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" .notes_count - if note_count > 0 %span.light %i.fa.fa-comments = note_count - if commit.description? .commit-row-description.js-toggle-content %pre = preserve(markdown(escape_once(commit.description), pipeline: :single_line)) .commit-row-info = commit_author_link(commit, avatar: true, size: 24) authored .committed_ago #{time_ago_with_tooltip(commit.committed_date, skip_js: true)}   = link_to_browse_code(project, commit) ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commit_list.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_commit_list.ht0000644000175600017570000000110012672631600031041 0ustar pravipravi%div.panel.panel-default .panel-heading Commits (#{@commits.count}) - if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE %ul.well-list - Commit.decorate(@commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE), @project).each do |commit| = render "projects/commits/inline_commit", commit: commit, project: @project %li.warning-row.unstyled other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden to prevent performance issues. - else %ul.well-list= render Commit.decorate(@commits, @project), project: @project ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_inline_commit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/_inline_commit.0000644000175600017570000000062512672631600031023 0ustar pravipravi%li.commit.inline-commit .commit-row-title = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"   %span.str-truncated = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" .pull-right #{time_ago_with_tooltip(commit.committed_date)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commits/show.html.haml0000644000175600017570000000327112672631600030623 0ustar pravipravi- page_title "Commits", @ref = render "header_title" = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "#{@project.name}:#{@ref} commits") = render "head" .gray-content-block.second-block .tree-ref-holder = render 'shared/ref_switcher', destination: 'commits' .block-controls.hidden-xs.hidden-sm - if @merge_request.present? .control = link_to "View Open Merge Request", namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: 'btn' - elsif create_mr_button?(@repository.root_ref, @ref) .control = link_to create_mr_path(@repository.root_ref, @ref), class: 'btn btn-success' do = icon('plus') Create Merge Request .control = form_tag(namespace_project_commits_path(@project.namespace, @project, @id), method: :get, class: 'pull-left commits-search-form') do = search_field_tag :search, params[:search], { placeholder: 'Filter by commit message', id: 'commits-search', class: 'form-control search-text-input', spellcheck: false } - if current_user && current_user.private_token .control = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'btn' do = icon("rss") %ul.breadcrumb.repo-breadcrumb = commits_breadcrumbs %div{id: dom_id(@project)} #commits-list.content_list= render "commits", project: @project .clear = spinner :javascript CommitsList.init("#{@ref}", #{@limit}); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/0000755000175600017570000000000012672631600026224 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/edit.html.haml0000644000175600017570000000040512672631600030756 0ustar pravipravi- page_title "Edit", @snippet.title, "Snippets" = render "header_title" %h3.page-title Edit Snippet %hr = render "shared/snippets/form", url: namespace_project_snippet_path(@project.namespace, @project, @snippet), visibility_level: @snippet.visibility_level ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/_actions.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/_actions.html.0000644000175600017570000000127012672631600030767 0ustar pravipravi= link_to new_namespace_project_snippet_path(@project.namespace, @project), class: 'btn btn-grouped new-snippet-link', title: "New Snippet" do = icon('plus') New Snippet - if can?(current_user, :admin_project_snippet, @snippet) = link_to namespace_project_snippet_path(@project.namespace, @project, @snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-grouped btn-remove", title: 'Delete Snippet' do = icon('trash-o') Delete - if can?(current_user, :update_project_snippet, @snippet) = link_to edit_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-grouped snippable-edit" do = icon('pencil-square-o') Edit gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/new.html.haml0000644000175600017570000000036212672631600030624 0ustar pravipravi- page_title "New Snippets" = render "header_title" %h3.page-title New Snippet %hr = render "shared/snippets/form", url: namespace_project_snippets_path(@project.namespace, @project, @snippet), visibility_level: default_snippet_visibility ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/_header_title.0000644000175600017570000000016212672631600031014 0ustar pravipravi- header_title project_title(@project, "Snippets", namespace_project_snippets_path(@project.namespace, @project)) ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/index.html.ham0000644000175600017570000000054412672631600030770 0ustar pravipravi- page_title "Snippets" = render "header_title" .gray-content-block.top-block .pull-right = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: "btn btn-new", title: "New Snippet" do = icon('plus') New Snippet .oneline Share code pastes with others out of git repository = render 'snippets/snippets' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/snippets/show.html.haml0000644000175600017570000000112212672631600031006 0ustar pravipravi- page_title @snippet.title, "Snippets" = render "header_title" .snippet-holder = render 'shared/snippets/header' %article.file-holder .file-title = blob_icon 0, @snippet.file_name %strong = @snippet.file_name .file-actions.hidden-xs = clipboard_button(clipboard_target: ".blob-content[data-blob-id='#{@snippet.id}']") = link_to 'Raw', raw_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-sm", target: "_blank" = render 'shared/snippets/blob' %div#notes= render "projects/notes/notes_with_form" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/0000755000175600017570000000000012672631600025643 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/_head.html.haml0000644000175600017570000000067712672631600030523 0ustar pravipravi%ul.nav-links = nav_link(action: :show) do = link_to 'Contributors', namespace_project_graph_path = nav_link(action: :commits) do = link_to 'Commits', commits_namespace_project_graph_path = nav_link(action: :languages) do = link_to 'Languages', languages_namespace_project_graph_path - if @project.builds_enabled? = nav_link(action: :ci) do = link_to ci_namespace_project_graph_path do Continuous Integration ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/languages.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/languages.html.h0000644000175600017570000000141712672631600030730 0ustar pravipravi- page_title "Languages", "Graphs" = render "header_title" = render 'head' .gray-content-block.append-bottom-default .oneline Programming languages used in this repository .row .col-md-8 %canvas#languages-chart{ height: 400 } .col-md-4 %ul.bordered-list - @languages.each do |language| %li %span{ style: "color: #{language[:color]}" } = icon('circle')   = language[:label] .pull-right = language[:value] \% :javascript var data = #{@languages.to_json}; var ctx = $("#languages-chart").get(0).getContext("2d"); var options = { scaleOverlay: true, responsive: true, maintainAspectRatio: false } var myPieChart = new Chart(ctx).Pie(data, options); ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/_header_title.ht0000644000175600017570000000017212672631600030770 0ustar pravipravi- header_title project_title(@project, "Graphs", namespace_project_graph_path(@project.namespace, @project, current_ref)) ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/commits.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/commits.html.ham0000644000175600017570000000474112672631600030756 0ustar pravipravi- page_title "Commits", "Graphs" = render "header_title" = render 'head' .gray-content-block.append-bottom-default .tree-ref-holder = render 'shared/ref_switcher', destination: 'graphs_commits' %ul.breadcrumb.repo-breadcrumb = commits_breadcrumbs %p.lead Commit statistics for %strong #{@ref} #{@commits_graph.start_date.strftime('%b %d')} - #{@commits_graph.end_date.strftime('%b %d')} .row .col-md-6 %ul %li %p.lead %strong #{@commits_graph.commits.size} commits during %strong #{@commits_graph.duration} days %li %p.lead Average %strong #{@commits_graph.commit_per_day} commits per day %li %p.lead Contributed by %strong #{@commits_graph.authors} authors .col-md-6 %div %p.slead Commits per day of month %canvas#month-chart .row .col-md-6 %div %p.slead Commits per day hour (UTC) %canvas#hour-chart .col-md-6 %div %p.slead Commits per weekday %canvas#weekday-chart :javascript var responsiveChart = function (selector, data) { var options = { "scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2, maintainAspectRatio: false }; // get selector by context var ctx = selector.get(0).getContext("2d"); // pointing parent container to make chart.js inherit its width var container = $(selector).parent(); var generateChart = function() { selector.attr('width', $(container).width()); return new Chart(ctx).Bar(data, options); }; // enabling auto-resizing $(window).resize(generateChart); return generateChart(); }; var chartData = function (keys, values) { var data = { labels : keys, datasets : [{ fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", barStrokeWidth: 1, barValueSpacing: 1, barDatasetSpacing: 1, data : values }] }; return data; }; var hourData = chartData(#{@commits_per_time.keys.to_json}, #{@commits_per_time.values.to_json}); responsiveChart($('#hour-chart'), hourData); var dayData = chartData(#{@commits_per_week_days.keys.to_json}, #{@commits_per_week_days.values.to_json}); responsiveChart($('#weekday-chart'), dayData); var monthData = chartData(#{@commits_per_month.keys.to_json}, #{@commits_per_month.values.to_json}); responsiveChart($('#month-chart'), monthData); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci.html.haml0000644000175600017570000000060312672631600030043 0ustar pravipravi- page_title "Continuous Integration", "Graphs" = render "header_title" = render 'head' .gray-content-block.append-bottom-default .oneline A collection of graphs for Continuous Integration #charts.ci-charts .row .col-md-6 = render 'projects/graphs/ci/overall' .col-md-6 = render 'projects/graphs/ci/build_times' %hr = render 'projects/graphs/ci/builds' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci/0000755000175600017570000000000012672631600026236 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci/_build_times.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci/_build_times.0000644000175600017570000000116112672631600030675 0ustar pravipravi%div %p.light Commit duration in minutes for last 30 commits %canvas#build_timesChart{height: 200} :javascript var data = { labels : #{@charts[:build_times].labels.to_json}, datasets : [ { fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", barStrokeWidth: 1, barValueSpacing: 1, barDatasetSpacing: 1, data : #{@charts[:build_times].build_times.to_json} } ] } var ctx = $("#build_timesChart").get(0).getContext("2d"); new Chart(ctx).Bar(data,{"scaleOverlay": true, responsive: true, maintainAspectRatio: false}); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci/_overall.haml0000644000175600017570000000071712672631600030711 0ustar pravipravi%h4 Overall stats %ul %li Total: %strong= pluralize @project.builds.count(:all), 'build' %li Successful: %strong= pluralize @project.builds.success.count(:all), 'build' %li Failed: %strong= pluralize @project.builds.failed.count(:all), 'build' %li Success ratio: %strong #{success_ratio(@project.builds.success, @project.builds.failed)}% %li Commits covered: %strong = @project.ci_commits.count(:all) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/ci/_builds.haml0000644000175600017570000000234712672631600030530 0ustar pravipravi%h4 Build charts %p   %span.cgreen = icon("circle") success   %span.cgray = icon("circle") all .prepend-top-default %p.light Builds for last week (#{date_from_to(Date.today - 7.days, Date.today)}) %canvas#weekChart{height: 200} .prepend-top-default %p.light Builds for last month (#{date_from_to(Date.today - 30.days, Date.today)}) %canvas#monthChart{height: 200} .prepend-top-default %p.light Builds for last year %canvas#yearChart.padded{height: 250} - [:week, :month, :year].each do |scope| :javascript var data = { labels : #{@charts[scope].labels.to_json}, datasets : [ { fillColor : "#7f8fa4", strokeColor : "#7f8fa4", pointColor : "#7f8fa4", pointStrokeColor : "#EEE", data : #{@charts[scope].total.to_json} }, { fillColor : "#44aa22", strokeColor : "#44aa22", pointColor : "#44aa22", pointStrokeColor : "#fff", data : #{@charts[scope].success.to_json} } ] } var ctx = $("##{scope}Chart").get(0).getContext("2d"); new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, maintainAspectRatio: false}); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/graphs/show.html.haml0000644000175600017570000000216712672631600030437 0ustar pravipravi- page_title "Contributors", "Graphs" = render "header_title" = render 'head' .gray-content-block.append-bottom-default .tree-ref-holder = render 'shared/ref_switcher', destination: 'graphs' %ul.breadcrumb.repo-breadcrumb = commits_breadcrumbs .loading-graph .center %h3.page-title %i.fa.fa-spinner.fa-spin Building repository graph. %p.slead Please wait a moment, this page will automatically refresh when ready. .stat-graph.hide .header.clearfix %h3#date_header.page-title %p.light Commits to #{@ref}, excluding merge commits. Limited by 6,000 commits %input#brush_change{:type => "hidden"} .graphs #contributors-master #contributors.clearfix %ol.contributors-list.clearfix :javascript $.ajax({ type: "GET", url: location.href, dataType: "json", success: function (data) { var graph = new ContributorsStatGraph(); graph.init(data); $("#brush_change").change(function(){ graph.change_date_header(); graph.redraw_authors(); }); $(".stat-graph").fadeIn(); $(".loading-graph").hide(); } }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/0000755000175600017570000000000012672631600027537 5ustar pravipravi././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_header0000644000175600017570000000017012672631600031047 0ustar pravipravi- header_title project_title(@project, "Members", namespace_project_project_members_path(@project.namespace, @project)) ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/import.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/import.0000644000175600017570000000147112672631600031055 0ustar pravipravi- page_title "Import members" = render "header_title" %h3.page-title Import members from another project %p.light Only project members will be imported. Group members will be skipped. %hr = form_tag apply_import_namespace_project_project_members_path(@project.namespace, @project), method: 'post', class: 'form-horizontal' do .form-group = label_tag :source_project_id, "Project", class: 'control-label' .col-sm-10= select_tag(:source_project_id, options_from_collection_for_select(current_user.authorized_projects, :id, :name_with_namespace), prompt: "Select project", class: "select2 lg", required: true) .form-actions = button_tag 'Import project members', class: "btn btn-create" = link_to "Cancel", namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-cancel" ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/index.h0000644000175600017570000000126512672631600031023 0ustar pravipravi- page_title "Members" = render "header_title" .project-members-page.prepend-top-default - if can?(current_user, :admin_project_member, @project) .panel.panel-default .panel-heading Add new user to project .controls = link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do Import members .panel-body %p.light Users with access to this project are listed below. = render "new_project_member" = render "team", members: @project_members - if @group = render "group_members", members: @group_members ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_project_member.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_projec0000644000175600017570000000510312672631600031102 0ustar pravipravi- user = member.user - return unless user || member.invite? %li{class: "#{dom_class(member)} js-toggle-container project_member_row access-#{member.human_access.downcase}", id: dom_id(member)} %span.list-item-name - if member.user = image_tag avatar_icon(user, 24), class: "avatar s24", alt: '' %strong = link_to user.name, user_path(user) %span.cgray= user.username - if user == current_user %span.label.label-success It's you - if user.blocked? %label.label.label-danger %strong Blocked - else = image_tag avatar_icon(member.invite_email, 24), class: "avatar s24", alt: '' %strong = member.invite_email %span.cgray invited - if member.created_by by = link_to member.created_by.name, user_path(member.created_by) = time_ago_with_tooltip(member.created_at) - if can?(current_user, :admin_project_member, @project) = link_to resend_invite_namespace_project_project_member_path(@project.namespace, @project, member), method: :post, class: "btn-xs btn", title: 'Resend invite' do Resend invite - if can?(current_user, :admin_project_member, @project) .pull-right %strong= member.human_access - if can?(current_user, :update_project_member, member) = button_tag class: "btn-xs btn js-toggle-button", title: 'Edit access level', type: 'button' do %i.fa.fa-pencil-square-o - if can?(current_user, :destroy_project_member, member)   - if current_user == user = link_to leave_namespace_project_project_members_path(@project.namespace, @project), data: { confirm: leave_project_message(@project) }, method: :delete, class: "btn-xs btn btn-remove", title: 'Leave project' do = icon("sign-out") Leave - else = link_to namespace_project_project_member_path(@project.namespace, @project, member), data: { confirm: remove_from_project_team_message(@project, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from team' do %i.fa.fa-minus.fa-inverse .edit-member.hide.js-toggle-content %br = form_for member, as: :project_member, url: namespace_project_project_member_path(@project.namespace, @project, member), remote: true do |f| .prepend-top-10 = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: 'form-control' .prepend-top-10 = f.submit 'Save', class: 'btn btn-save' ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/update.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/update.0000644000175600017570000000020212672631600031014 0ustar pravipravi:plain $("##{dom_id(@project_member)}").replaceWith('#{escape_javascript(render("project_member", member: @project_member))}'); ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_group_members.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_group_0000644000175600017570000000120012672631600031105 0ustar pravipravi.panel.panel-default .panel-heading %strong #{@group.name} group members %small (#{members.count}) - if can?(current_user, :admin_group_member, @group) .controls = link_to group_group_members_path(@group), class: 'btn' do = icon('pencil-square-o') Manage group members %ul.content-list - members.limit(20).each do |member| = render 'groups/group_members/group_member', member: member, show_controls: false - if members.count > 20 %li and #{members.count - 20} more. For full list visit #{link_to 'group members page', group_group_members_path(@group)} ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_new_project_member.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_new_pr0000644000175600017570000000172312672631600031116 0ustar pravipravi= form_for @project_member, as: :project_member, url: namespace_project_project_members_path(@project.namespace, @project), html: { class: 'form-horizontal users-project-form' } do |f| .form-group = f.label :user_ids, "People", class: 'control-label' .col-sm-10 = users_select_tag(:user_ids, multiple: true, class: 'input-large', scope: :all, email_user: true) .help-block Search for users by name, username, or email, or invite new ones using their email address. .form-group = f.label :access_level, "Project Access", class: 'control-label' .col-sm-10 = select_tag :access_level, options_for_select(ProjectMember.access_roles, @project_member.access_level), class: "project-access-select select2" .help-block Read more about role permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" .form-actions = f.submit 'Add users to project', class: "btn btn-create" ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_team.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/project_members/_team.h0000644000175600017570000000145712672631600031004 0ustar pravipravi.panel.panel-default .panel-heading %strong #{@project.name} project members %small (#{members.count}) .controls = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do .form-group = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control', spellcheck: false } = button_tag class: 'btn', title: 'Search' do = icon("search") %ul.content-list - members.each do |project_member| = render 'project_member', member: project_member :javascript $('form.member-search-form').on('submit', function (event) { event.preventDefault(); Turbolinks.visit(this.action + '?' + $(this).serialize()); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/0000755000175600017570000000000012672631600025621 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/edit.html.haml0000644000175600017570000000016412672631600030355 0ustar pravipravi- page_title "Edit", @label.name, "Labels" = render "header_title" %h3.page-title Edit Label %hr = render 'form' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/new.html.haml0000644000175600017570000000014112672631600030214 0ustar pravipravi- page_title "New Label" = render "header_title" %h3.page-title New Label %hr = render 'form' ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/_header_title.ht0000644000175600017570000000015612672631600030750 0ustar pravipravi- header_title project_title(@project, "Labels", namespace_project_labels_path(@project.namespace, @project)) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/destroy.js.haml0000644000175600017570000000015612672631600030572 0ustar pravipravi- if @project.labels.size == 0 $('.labels').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/index.html.haml0000644000175600017570000000136512672631600030543 0ustar pravipravi- page_title "Labels" = render "header_title" .top-area .nav-text Labels can be applied to issues and merge requests. .nav-controls - if can? current_user, :admin_label, @project = link_to new_namespace_project_label_path(@project.namespace, @project), class: "btn btn-new" do = icon('plus') New label .labels - if @labels.present? %ul.content-list.manage-labels-list = render @labels = paginate @labels, theme: 'gitlab' - else .nothing-here-block - if can? current_user, :admin_label, @project Create first label or #{link_to 'generate', generate_namespace_project_labels_path(@project.namespace, @project), method: :post} default set of labels - else No labels created gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/_form.html.haml0000644000175600017570000000267512672631600030543 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @label], html: { class: 'form-horizontal label-form js-requires-input' } do |f| -if @label.errors.any? .row .col-sm-offset-2.col-sm-10 .alert.alert-danger - @label.errors.full_messages.each do |msg| %span= msg %br .form-group = f.label :title, class: 'control-label' .col-sm-10 = f.text_field :title, class: "form-control js-quick-submit", required: true, autofocus: true .form-group = f.label :description, class: 'control-label' .col-sm-10 = f.text_field :description, class: "form-control js-quick-submit" .form-group = f.label :color, "Background color", class: 'control-label' .col-sm-10 .input-group .input-group-addon.label-color-preview   = f.color_field :color, class: "form-control" .help-block Choose any color. %br Or you can choose one of suggested colors below .suggest-colors - suggested_colors.each do |color| = link_to '#', style: "background-color: #{color}", data: { color: color } do   .form-actions - if @label.persisted? = f.submit 'Save changes', class: 'btn btn-save js-save-button' - else = f.submit 'Create Label', class: 'btn btn-create js-save-button' = link_to "Cancel", namespace_project_labels_path(@project.namespace, @project), class: 'btn btn-cancel' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/labels/_label.html.haml0000644000175600017570000000111312672631600030641 0ustar pravipravi%li{id: dom_id(label)} = render "shared/label_row", label: label .pull-right %strong.append-right-20 = link_to_label(label) do = pluralize label.open_issues_count, 'open issue' - if can? current_user, :admin_label, @project = link_to 'Edit', edit_namespace_project_label_path(@project.namespace, @project, label), class: 'btn btn-sm' = link_to 'Delete', namespace_project_label_path(@project.namespace, @project, label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_files.html.haml0000644000175600017570000000023412672631600027425 0ustar pravipravi#tree-holder.tree-holder.clearfix .nav-block = render 'projects/tree/tree_header', tree: @tree = render 'projects/tree/tree_content', tree: @tree gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/builds/0000755000175600017570000000000012672631600025641 5ustar pravipravi././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/builds/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/builds/_header_title.ht0000644000175600017570000000012012672631600030757 0ustar pravipravi- header_title project_title(@project, "Builds", project_builds_path(@project)) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/builds/index.html.haml0000644000175600017570000000346712672631600030570 0ustar pravipravi- page_title "Builds" = render "header_title" .top-area %ul.nav-links %li{class: ('active' if @scope.nil?)} = link_to project_builds_path(@project) do All %span.badge.js-totalbuilds-count = number_with_delimiter(@all_builds.count(:id)) %li{class: ('active' if @scope == 'running')} = link_to project_builds_path(@project, scope: :running) do Running %span.badge.js-running-count = number_with_delimiter(@all_builds.running_or_pending.count(:id)) %li{class: ('active' if @scope == 'finished')} = link_to project_builds_path(@project, scope: :finished) do Finished %span.badge.js-running-count = number_with_delimiter(@all_builds.finished.count(:id)) .nav-controls - if can?(current_user, :update_build, @project) - if @all_builds.running_or_pending.any? = link_to 'Cancel running', cancel_all_namespace_project_builds_path(@project.namespace, @project), data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post = link_to ci_lint_path, class: 'btn btn-default' do = icon('wrench') %span CI Lint .gray-content-block #{(@scope || 'running').capitalize} builds from this project %ul.content-list - if @builds.blank? %li .nothing-here-block No builds to show - else .table-holder %table.table.builds %thead %tr %th Status %th Build ID %th Commit %th Ref %th Stage %th Name %th Duration %th Finished at %th - @builds.each do |build| = render 'projects/commit_statuses/commit_status', commit_status: build, commit_sha: true, stage: true, allow_retry: true = paginate @builds, theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/builds/show.html.haml0000644000175600017570000001665712672631600030446 0ustar pravipravi- page_title "#{@build.name} (##{@build.id})", "Builds" = render "header_title" .build-page .gray-content-block.top-block Build ##{@build.id} for commit %strong.monospace= link_to @build.commit.short_sha, ci_status_path(@build.commit) from = link_to @build.ref, namespace_project_commits_path(@project.namespace, @project, @build.ref) - merge_request = @build.merge_request - if merge_request via = link_to "merge request ##{merge_request.iid}", merge_request_path(merge_request) #up-build-trace - if @commit.matrix_for_ref?(@build.ref) %ul.nav-links.no-top.no-bottom - @commit.latest_builds_for_ref(@build.ref).each do |build| %li{class: ('active' if build == @build) } = link_to namespace_project_build_path(@project.namespace, @project, build) do = ci_icon_for_status(build.status) %span - if build.name = build.name - else = build.id - if @build.retried? %li.active %a Build ##{@build.id} · %i.fa.fa-warning This build was retried. .gray-content-block.middle-block .build-head .clearfix = ci_status_with_icon(@build.status) - if @build.duration %span %i.fa.fa-time #{duration_in_words(@build.finished_at, @build.started_at)} .pull-right #{time_ago_with_tooltip(@build.finished_at) if @build.finished_at} - if @build.show_warning? - unless @build.any_runners_online? .bs-callout.bs-callout-warning %p - if no_runners_for_project?(@build.project) This build is stuck, because the project doesn't have any runners online assigned to it. - elsif @build.tags.any? This build is stuck, because you don't have any active runners online with any of these tags assigned to them: - @build.tags.each do |tag| %span.label.label-primary = tag - else This build is stuck, because you don't have any active runners that can run this build. %br Go to = link_to namespace_project_runners_path(@build.project.namespace, @build.project) do Runners page .row.prepend-top-default .col-md-9 .clearfix - if @build.active? .autoscroll-container %button.btn.btn-success.btn-sm#autoscroll-button{:type => "button", :data => {:state => 'disabled'}} enable autoscroll .clearfix .scroll-controls = link_to '#up-build-trace', class: 'btn' do %i.fa.fa-angle-up = link_to '#down-build-trace', class: 'btn' do %i.fa.fa-angle-down - if @build.erased? .erased.alert.alert-warning - erased_by = "by #{link_to @build.erased_by.name, user_path(@build.erased_by)}" if @build.erased_by Build has been erased #{erased_by.html_safe} #{time_ago_with_tooltip(@build.erased_at)} - else %pre.trace#build-trace %code.bash = preserve do = raw @build.trace_html %div#down-build-trace .col-md-3 - if @build.coverage .build-widget %h4.title Test coverage %h1 #{@build.coverage}% - if can?(current_user, :read_build, @project) && @build.artifacts? .build-widget.artifacts %h4.title Build artifacts .center .btn-group{ role: :group } = link_to @build.artifacts_download_url, class: 'btn btn-sm btn-primary' do = icon('download') Download - if @build.artifacts_metadata? = link_to @build.artifacts_browse_url, class: 'btn btn-sm btn-primary' do = icon('folder-open') Browse .build-widget %h4.title Build ##{@build.id} - if can?(current_user, :update_build, @project) .center .btn-group{ role: :group } - if @build.cancel_url = link_to "Cancel", @build.cancel_url, class: 'btn btn-sm btn-danger', method: :post - elsif @build.retry_url = link_to "Retry", @build.retry_url, class: 'btn btn-sm btn-primary', method: :post - if @build.erasable? = link_to erase_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-warning', method: :post, data: { confirm: 'Are you sure you want to erase this build?' } do = icon('eraser') Erase .clearfix - if @build.duration %p %span.attr-name Duration: #{duration_in_words(@build.finished_at, @build.started_at)} %p %span.attr-name Created: #{time_ago_with_tooltip(@build.created_at)} - if @build.finished_at %p %span.attr-name Finished: #{time_ago_with_tooltip(@build.finished_at)} - if @build.erased_at %p %span.attr-name Erased: #{time_ago_with_tooltip(@build.erased_at)} %p %span.attr-name Runner: - if @build.runner && current_user && current_user.admin = link_to "##{@build.runner.id}", admin_runner_path(@build.runner.id) - elsif @build.runner \##{@build.runner.id} - if @build.trigger_request .build-widget %h4.title Trigger %p %span.attr-name Token: #{@build.trigger_request.trigger.short_token} - if @build.trigger_request.variables %p %span.attr-name Variables: %code - @build.trigger_request.variables.each do |key, value| #{key}=#{value} .build-widget %h4.title Commit .pull-right %small = link_to @build.commit.short_sha, ci_status_path(@build.commit), class: "monospace" %p %span.attr-name Branch: = link_to @build.ref, namespace_project_commits_path(@project.namespace, @project, @build.ref) %p %span.attr-name Author: #{@build.commit.git_author_name} %p %span.attr-name Message: #{@build.commit.git_commit_message} - if @build.tags.any? .build-widget %h4.title Tags - @build.tag_list.each do |tag| %span.label.label-primary = tag - if @builds.present? .build-widget %h4.title #{pluralize(@builds.count(:id), "other build")} for = succeed ":" do = link_to @build.commit.short_sha, ci_status_path(@build.commit), class: "monospace" %table.table.builds - @builds.each_with_index do |build, i| %tr.build %td = ci_icon_for_status(build.status) %td = link_to namespace_project_build_path(@project.namespace, @project, build) do - if build.name = build.name - else %span ##{build.id} %td.status= build.status :javascript new CiBuild("#{namespace_project_build_url(@project.namespace, @project, @build)}", "#{@build.status}") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/forks/0000755000175600017570000000000012672631600025503 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/forks/new.html.haml0000644000175600017570000000307212672631600030104 0ustar pravipravi- page_title "Fork project" - if @namespaces.present? %h3.page-title Fork project %p.lead Click to fork the project to a user or group %hr .fork-namespaces - @namespaces.in_groups_of(6, false) do |group| .row - group.each do |namespace| .col-md-2.col-sm-3 - if fork = namespace.find_fork_of(@project) .fork-thumbnail = link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do = image_tag namespace_icon(namespace, 100) .caption %strong = namespace.human_name %div.text-primary Already forked - else .fork-thumbnail = link_to namespace_project_forks_path(@project.namespace, @project, namespace_key: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do = image_tag namespace_icon(namespace, 100) .caption %strong = namespace.human_name %p.light Fork is a copy of a project repository. %br Forking a repository allows you to do changes without affecting the original project. - else %h3 No available namespaces to fork the project %p.slead You must have permission to create a project in a namespace before forking. .save-project-loader.hide .center %h2 %i.fa.fa-spinner.fa-spin Forking repository %p Please wait a moment, this page will automatically refresh when ready. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/forks/error.html.haml0000644000175600017570000000110212672631600030434 0ustar pravipravi- page_title "Fork project" - if @forked_project && !@forked_project.saved? .alert.alert-danger.alert-block %h4 %i.fa.fa-code-fork Fork Error! %p You tried to fork = link_to_project @project but it failed for the following reason: - if @forked_project && @forked_project.errors.any? %p – = @forked_project.errors.full_messages.first %p = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork", class: "btn" do %i.fa.fa-code-fork Try to Fork again gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/forks/index.html.haml0000644000175600017570000000474612672631600030433 0ustar pravipravi.top-area .nav-text - full_count_title = "#{@public_forks_count} public and #{@private_forks_count} private" == #{pluralize(@total_forks_count, 'fork')}: #{full_count_title} .nav-controls = search_field_tag :filter_projects, nil, placeholder: 'Search forks', class: 'projects-list-filter project-filter-form-field form-control input-short', spellcheck: false, data: { 'filter-selector' => 'span.namespace-name' } .dropdown %button.dropdown-toggle.btn.sort-forks{type: 'button', 'data-toggle' => 'dropdown'} %span.light sort: - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_created %b.caret %ul.dropdown-menu.dropdown-menu-align-right %li - excluded_filters = [:state, :scope, :label_name, :milestone_id, :assignee_id, :author_id] = link_to page_filter_path(sort: sort_value_recently_created, without: excluded_filters) do = sort_title_recently_created = link_to page_filter_path(sort: sort_value_oldest_created, without: excluded_filters) do = sort_title_oldest_created = link_to page_filter_path(sort: sort_value_recently_updated, without: excluded_filters) do = sort_title_recently_updated = link_to page_filter_path(sort: sort_value_oldest_updated, without: excluded_filters) do = sort_title_oldest_updated - if current_user && can?(current_user, :fork_project, @project) - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn btn-new' do = icon('code-fork fw') Fork - else = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn btn-new' do = icon('code-fork fw') Fork .projects-list-holder - if @forks.blank? %ul.content-list %li .nothing-here-block No forks to show - else = render 'shared/projects/list', projects: @forks, use_creator_avatar: true, forks: true, show_last_commit_as_description: true - if @private_forks_count > 0 %ul.projects-list.private-forks-notice %li.project-row = icon('lock fw', base: 'circle', class: 'fa-lg private-fork-icon') %strong= pluralize(@private_forks_count, 'private fork') %span you have no access to. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/show.html.haml0000644000175600017570000000475712672631600027162 0ustar pravipravi- @no_container = true = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_path(@project.namespace, @project, format: :atom, private_token: current_user.private_token), title: "#{@project.name} activity") = content_for :flash_message do - if current_user && can?(current_user, :download_code, @project) = render 'shared/no_ssh' = render 'shared/no_password' = render 'projects/last_push' = render "home_panel" .project-stats.gray-content-block.second-block %ul.nav %li = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do = pluralize(number_with_delimiter(@project.commit_count), 'commit') %li = link_to namespace_project_branches_path(@project.namespace, @project) do = pluralize(number_with_delimiter(@repository.branch_names.count), 'branch') %li = link_to namespace_project_tags_path(@project.namespace, @project) do = pluralize(number_with_delimiter(@repository.tag_names.count), 'tag') %li = link_to project_files_path(@project) do = repository_size - if default_project_view != 'readme' && @repository.readme %li = link_to 'Readme', readme_path(@project) - if @repository.changelog %li = link_to 'Changelog', changelog_path(@project) - if @repository.license %li = link_to 'License', license_path(@project) - if @repository.contribution_guide %li = link_to 'Contribution guide', contribution_guide_path(@project) - if current_user && can_push_branch?(@project, @project.default_branch) - unless @repository.changelog %li.missing = link_to add_changelog_path(@project) do Add Changelog - unless @repository.license %li.missing = link_to add_license_path(@project) do Add License - unless @repository.contribution_guide %li.missing = link_to add_contribution_guide_path(@project) do Add Contribution guide - if @repository.commit .content-block.second-block.white %div{ class: container_class } = render 'projects/last_commit', commit: @repository.commit, project: @project %div{ class: container_class } - if @project.archived? .text-warning.center.prepend-top-20 %p = icon("exclamation-triangle fw") Archived project! Repository is read-only %div{class: "project-show-#{default_project_view}"} = render default_project_view gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/0000755000175600017570000000000012672631600025275 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/edit.html.haml0000644000175600017570000000230612672631600030031 0ustar pravipravi- page_title "Edit", @blob.path, @ref = render "header_title" .file-editor %ul.nav-links.no-bottom.js-edit-mode %li.active = link_to '#editor' do = icon('edit') Edit File %li = link_to '#preview', 'data-preview-url' => namespace_project_preview_blob_path(@project.namespace, @project, @id) do = icon('eye') = editing_preview_title(@blob.name) = form_tag(namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: 'form-horizontal js-requires-input js-edit-blob-form') do = render 'projects/blob/editor', ref: @ref, path: @path, blob_data: @blob.data = render 'shared/new_commit_form', placeholder: "Update #{@blob.name}" = hidden_field_tag 'last_commit', @last_commit = hidden_field_tag 'content', '', id: "file-content" = hidden_field_tag 'from_merge_request_id', params[:from_merge_request_id] = render 'projects/commit_button', ref: @ref, cancel_path: namespace_project_blob_path(@project.namespace, @project, @id) :javascript blob = new EditBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", "#{@blob.language.try(:ace_mode)}") new NewCommitForm($('.js-edit-blob-form')) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_actions.html.haml0000644000175600017570000000172112672631600030703 0ustar pravipravi.btn-group.tree-btn-group = link_to 'Raw', namespace_project_raw_path(@project.namespace, @project, @id), class: 'btn btn-sm', target: '_blank' -# only show normal/blame view links for text files - if blob_text_viewable?(@blob) - if current_page? namespace_project_blame_path(@project.namespace, @project, @id) = link_to 'Normal View', namespace_project_blob_path(@project.namespace, @project, @id), class: 'btn btn-sm' - else = link_to 'Blame', namespace_project_blame_path(@project.namespace, @project, @id), class: 'btn btn-sm' unless @blob.empty? = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-sm' = link_to 'Permalink', namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.sha, @path)), class: 'btn btn-sm' - if current_user .btn-group{ role: "group" } = edit_blob_link = replace_blob_link = delete_blob_link gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/new.html.haml0000644000175600017570000000134512672631600027677 0ustar pravipravi- page_title "New File", @path.presence, @ref = render "header_title" %h3.page-title New File .file-editor = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal js-new-blob-form js-requires-input') do = render 'projects/blob/editor', ref: @ref = render 'shared/new_commit_form', placeholder: "Add new file" = hidden_field_tag 'content', '', id: 'file-content' = render 'projects/commit_button', ref: @ref, cancel_path: namespace_project_tree_path(@project.namespace, @project, @id) :javascript blob = new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) new NewCommitForm($('.js-new-blob-form')) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/diff.html.haml0000644000175600017570000000157412672631600030022 0ustar pravipravi- if @lines.present? - if @form.unfold? && @form.since != 1 && !@form.bottom? %tr.line_holder{ id: @form.since } = render "projects/diffs/match_line", {line: @match_line, line_old: @form.since, line_new: @form.since, bottom: false, new_file: false} - @lines.each_with_index do |line, index| - line_new = index + @form.since - line_old = line_new - @form.offset %tr.line_holder %td.old_line.diff-line-num{data: {linenumber: line_old}} = link_to raw(line_old), "#" %td.new_line.diff-line-num = link_to raw(line_new) , "#" %td.line_content.noteable_line==#{' ' * @form.indent}#{line} - if @form.unfold? && @form.bottom? && @form.to < @blob.loc %tr.line_holder{ id: @form.to } = render "projects/diffs/match_line", {line: @match_line, line_old: @form.to, line_new: @form.to, bottom: true, new_file: false} ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_header_title.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_header_title.html0000644000175600017570000000011612672631600030751 0ustar pravipravi- header_title project_title(@project, "Files", project_files_path(@project)) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_text.html.haml0000644000175600017570000000041612672631600030227 0ustar pravipravi- blob.load_all_data!(@repository) - if markup?(blob.name) .file-content.wiki = render_markup(blob.name, blob.data) - else - unless blob.empty? = render 'shared/file_highlight', blob: blob - else .file-content.code .nothing-here-block Empty file gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_new_dir.html.haml0000644000175600017570000000205212672631600030670 0ustar pravipravi#modal-create-new-dir.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title Create New Directory .modal-body = form_tag namespace_project_create_dir_path(@project.namespace, @project, @id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-requires-input' do .form-group = label_tag :dir_name, 'Directory name', class: 'control-label' .col-sm-10 = text_field_tag :dir_name, params[:dir_name], required: true, class: 'form-control' = render 'shared/new_commit_form', placeholder: "Add new directory" .form-actions = submit_tag "Create directory", class: 'btn btn-create' = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" - unless can?(current_user, :push_code, @project) .inline.prepend-left-10 = commit_in_fork_help :javascript new NewCommitForm($('.js-create-dir-form')) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_upload.html.haml0000644000175600017570000000240212672631600030524 0ustar pravipravi#modal-upload-blob.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title #{title} .modal-body = form_tag form_path, method: method, class: 'js-upload-blob-form form-horizontal' do .dropzone .dropzone-previews.blob-upload-dropzone-previews %p.dz-message.light Attach a file by drag & drop or = link_to 'click to upload', '#', class: "markdown-selector" %br .dropzone-alerts{class: "alert alert-danger data", style: "display:none"} = render 'shared/new_commit_form', placeholder: placeholder .form-actions = button_tag button_title, class: 'btn btn-small btn-create btn-upload-file', id: 'submit-all' = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" - unless can?(current_user, :push_code, @project) .inline.prepend-left-10 = commit_in_fork_help :javascript disableButtonIfEmptyField($('.js-upload-blob-form').find('.js-commit-message'), '.btn-upload-file'); new BlobFileDropzone($('.js-upload-blob-form'), '#{method}'); new NewCommitForm($('.js-upload-blob-form')) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_blob.html.haml0000644000175600017570000000262712672631600030167 0ustar pravipravi.nav-block .tree-ref-holder = render 'shared/ref_switcher', destination: 'blob', path: @path %ul.breadcrumb.repo-breadcrumb %li = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = @project.path - tree_breadcrumbs(@tree, 6) do |title, path| %li - if path - if path.end_with?(@path) = link_to namespace_project_blob_path(@project.namespace, @project, path) do %strong = truncate(title, length: 40) - else = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - else = link_to title, '#' %ul.blob-commit-info.hidden-xs - blob_commit = @repository.last_commit_for_path(@commit.id, blob.path) = render blob_commit, project: @project %div#blob-content-holder.blob-content-holder %article.file-holder .file-title = blob_icon blob.mode, blob.name %strong = blob.name %small = number_to_human_size(blob_size(blob)) .file-actions.hidden-xs = render "actions" - if blob.lfs_pointer? = render "download", blob: blob - elsif blob.text? - if blob_svg?(blob) = render "image", blob: blob - else = render "text", blob: blob - elsif blob.image? = render "image", blob: blob - else = render "download", blob: blob gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_editor.html.haml0000644000175600017570000000140312672631600030526 0ustar pravipravi.file-holder.file.append-bottom-default .file-title.clearfix .editor-ref = icon('code-fork') = ref %span.editor-file-name = @path - if current_action?(:new) || current_action?(:create) %span.editor-file-name \/ = text_field_tag 'file_name', params[:file_name], placeholder: "File name", required: true, class: 'form-control new-file-name js-quick-submit' .pull-right = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' .file-content.code %pre.js-edit-mode-pane#editor #{params[:content] || local_assigns[:blob_data]} - if local_assigns[:path] .js-edit-mode-pane#preview.hide .center %h2 %i.icon-spinner.icon-spin gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_remove.html.haml0000644000175600017570000000135012672631600030536 0ustar pravipravi#modal-remove-blob.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title Delete #{@blob.name} .modal-body = form_tag namespace_project_blob_path(@project.namespace, @project, @id), method: :delete, class: 'form-horizontal js-replace-blob-form js-requires-input' do = render 'shared/new_commit_form', placeholder: "Delete #{@blob.name}" .form-group .col-sm-offset-2.col-sm-10 = button_tag 'Delete file', class: 'btn btn-remove btn-remove-file' = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" :javascript new NewCommitForm($('.js-replace-blob-form')) ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_download.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_download.html.ham0000644000175600017570000000036012672631600030674 0ustar pravipravi.file-content.blob_file.blob-no-preview .center = link_to namespace_project_raw_path(@project.namespace, @project, @id) do %h1.light %i.fa.fa-download %h4 Download (#{number_to_human_size blob_size(blob)}) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/show.html.haml0000644000175600017570000000066712672631600030074 0ustar pravipravi- page_title @blob.path, @ref = render "header_title" = render 'projects/last_push' %div#tree-holder.tree-holder = render 'blob', blob: @blob - if can_edit_blob?(@blob) = render 'projects/blob/remove' - title = "Replace #{@blob.name}" = render 'projects/blob/upload', title: title, placeholder: title, button_title: 'Replace file', form_path: namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/_image.html.haml0000644000175600017570000000064712672631600030333 0ustar pravipravi.file-content.image_file - if blob_svg?(blob) - # We need to scrub SVG but we cannot do so in the RawController: it would - # be wrong/strange if RawController modified the data. - blob.load_all_data!(@repository) - blob = sanitize_svg(blob) %img{src: "data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}"} - else %img{src: namespace_project_raw_path(@project.namespace, @project, @id)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blob/preview.html.haml0000644000175600017570000000163112672631600030565 0ustar pravipravi.diff-file .diff-content - if gitlab_markdown?(@blob.name) .file-content.wiki = preserve do = markdown(@content) - elsif markup?(@blob.name) .file-content.wiki = raw render_markup(@blob.name, @content) - else .file-content.code.js-syntax-highlight - unless @diff_lines.empty? %table.text-file - @diff_lines.each do |line| %tr.line_holder{ class: "#{line.type}" } - if line.type == "match" %td.old_line.diff-line-num= "..." %td.new_line.diff-line-num= "..." %td.line_content.match= line.text - else %td.old_line.diff-line-num %td.new_line.diff-line-num %td.line_content{class: "#{line.type}"}= diff_line_content(line.text) - else .nothing-here-block No changes. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_last_commit.html.haml0000644000175600017570000000115412672631600030640 0ustar pravipravi.project-last-commit - ci_commit = project.ci_commit(commit.sha) - if ci_commit = link_to ci_status_path(ci_commit), class: "ci-status ci-#{ci_commit.status}" do = ci_status_icon(ci_commit) = ci_status_label(ci_commit) = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit), class: "commit-row-message" · #{time_ago_with_tooltip(commit.committed_date, skip_js: true)} by = commit_author_link(commit, avatar: true, size: 24) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/no_repo.html.haml0000644000175600017570000000137712672631600027636 0ustar pravipravi%h2 %i.fa.fa-warning No repository %p.slead The repository for this project does not exist. %br This means you can not push code until you create an empty repository or import existing one. %hr .no-repo-actions = link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do Create empty bare repository %strong.prepend-left-10.append-right-10 or = link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do Import repository - if can? current_user, :remove_project, @project .prepend-top-20 = link_to 'Remove project', project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_errors.html.haml0000644000175600017570000000025212672631600027637 0ustar pravipravi- if @project.errors.any? .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × = @project.errors.full_messages.first gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/0000755000175600017570000000000012672631600025647 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_builds.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_builds.html.ham0000644000175600017570000000505612672631600030730 0ustar pravipravi.gray-content-block.middle-block .pull-right - if can?(current_user, :update_build, @ci_commit.project) - if @ci_commit.builds.latest.failed.any?(&:retryable?) = link_to "Retry failed", retry_builds_namespace_project_commit_path(@ci_commit.project.namespace, @ci_commit.project, @ci_commit.sha), class: 'btn btn-grouped btn-primary', method: :post - if @ci_commit.builds.running_or_pending.any? = link_to "Cancel running", cancel_builds_namespace_project_commit_path(@ci_commit.project.namespace, @ci_commit.project, @ci_commit.sha), data: { confirm: 'Are you sure?' }, class: 'btn btn-grouped btn-danger', method: :post .oneline = pluralize @statuses.count(:id), "build" - if defined?(link_to_commit) && link_to_commit for commit = link_to @ci_commit.short_sha, namespace_project_commit_path(@ci_commit.project.namespace, @ci_commit.project, @ci_commit.sha), class: "monospace" - if @ci_commit.duration > 0 in = time_interval_in_words @ci_commit.duration - if @ci_commit.yaml_errors.present? .bs-callout.bs-callout-danger %h4 Found errors in your .gitlab-ci.yml: %ul - @ci_commit.yaml_errors.split(",").each do |error| %li= error You can also test your .gitlab-ci.yml in the #{link_to "Lint", ci_lint_path} - if @ci_commit.project.builds_enabled? && !@ci_commit.ci_yaml_file .bs-callout.bs-callout-warning \.gitlab-ci.yml not found in this commit .table-holder %table.table.builds %thead %tr %th Status %th Build ID %th Ref %th Stage %th Name %th Duration %th Finished at - if @ci_commit.project.build_coverage_enabled? %th Coverage %th - @ci_commit.refs.each do |ref| = render partial: "projects/commit_statuses/commit_status", collection: @ci_commit.statuses.for_ref(ref).latest.ordered, locals: { coverage: @ci_commit.project.build_coverage_enabled?, stage: true, allow_retry: true } - if @ci_commit.retried.any? .gray-content-block.second-block Retried builds .table-holder %table.table.builds %thead %tr %th Status %th Build ID %th Ref %th Stage %th Name %th Duration %th Finished at - if @ci_commit.project.build_coverage_enabled? %th Coverage %th = render partial: "projects/commit_statuses/commit_status", collection: @ci_commit.retried, locals: { coverage: @ci_commit.project.build_coverage_enabled?, stage: true } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_ci_menu.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_ci_menu.html.ha0000644000175600017570000000062112672631600030701 0ustar pravipravi%ul.nav-links.no-top.no-bottom.commit-ci-menu = nav_link(path: 'commit#show') do = link_to namespace_project_commit_path(@project.namespace, @project, @commit.id) do Changes %span.badge= @diffs.count = nav_link(path: 'commit#builds') do = link_to builds_namespace_project_commit_path(@project.namespace, @project, @commit.id) do Builds %span.badge= @statuses.count ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_revert.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_revert.html.ham0000644000175600017570000000307212672631600030751 0ustar pravipravi#modal-revert-commit.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title== Revert this #{revert_commit_type(commit)} .modal-body = form_tag revert_namespace_project_commit_path(@project.namespace, @project, commit.id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-requires-input' do .form-group.branch = label_tag 'target_branch', 'Revert in branch', class: 'control-label' .col-sm-10 = select_tag "target_branch", grouped_options_refs, class: "select2 select2-sm js-target-branch" - if can?(current_user, :push_code, @project) .js-create-merge-request-container .checkbox - nonce = SecureRandom.hex = label_tag "create_merge_request-#{nonce}" do = check_box_tag 'create_merge_request', 1, true, class: 'js-create-merge-request', id: "create_merge_request-#{nonce}" Start a new merge request with these changes - else = hidden_field_tag 'create_merge_request', 1 .form-actions = submit_tag "Revert", class: 'btn btn-create' = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" - unless can?(current_user, :push_code, @project) .inline.prepend-left-10 = commit_in_fork_help :javascript new NewCommitForm($('.js-create-dir-form')) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/builds.html.haml0000644000175600017570000000030712672631600030737 0ustar pravipravi- page_title "Builds", "#{@commit.title} (#{@commit.short_id})", "Commits" = render "projects/commits/header_title" .prepend-top-default = render "commit_box" = render "ci_menu" = render "builds" ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/branches.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/branches.html.ha0000644000175600017570000000107112672631600030710 0ustar pravipravi- if @branches.any? %span - branch = commit_default_branch(@project, @branches) = link_to(namespace_project_tree_path(@project.namespace, @project, branch)) do %span.label.label-gray %i.fa.fa-code-fork = branch - if @branches.any? || @tags.any? = link_to("#", class: "js-details-expand") do %span.label.label-gray \... %span.js-details-content.hide - if @branches.any? = commit_branches_links(@project, @branches) - if @tags.any? = commit_tags_links(@project, @tags) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/show.html.haml0000644000175600017570000000100512672631600030431 0ustar pravipravi- page_title "#{@commit.title} (#{@commit.short_id})", "Commits" - page_description @commit.description = render "projects/commits/header_title" .prepend-top-default = render "commit_box" - if @ci_commit = render "ci_menu" - else %div.block-connector = render "projects/diffs/diffs", diffs: @diffs, project: @project, diff_refs: @diff_refs = render "projects/notes/notes_with_form" - if can_collaborate_with_project? = render "projects/commit/revert", commit: @commit, title: @commit.title ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_commit_box.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/commit/_commit_box.html0000644000175600017570000000451112672631600031035 0ustar pravipravi.pull-right %div - if @notes_count > 0 %span.btn.disabled.btn-grouped %i.fa.fa-comment = @notes_count .pull-left.btn-group %a.btn.btn-grouped.dropdown-toggle{ data: {toggle: :dropdown} } %i.fa.fa-download Download as %span.caret %ul.dropdown-menu - unless @commit.parents.length > 1 %li= link_to "Email Patches", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch) %li= link_to "Plain Diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff) = link_to namespace_project_tree_path(@project.namespace, @project, @commit), class: "btn btn-grouped" do = icon('files-o') Browse Files - unless @commit.has_been_reverted?(current_user) = revert_commit_link(@commit, namespace_project_commit_path(@project.namespace, @project, @commit.id)) %div %p %span.light Commit = link_to @commit.id, namespace_project_commit_path(@project.namespace, @project, @commit), class: "monospace" = clipboard_button(clipboard_text: @commit.id) .commit-info-row %span.light Authored by %strong = commit_author_link(@commit, avatar: true, size: 24) #{time_ago_with_tooltip(@commit.authored_date)} - if @commit.different_committer? .commit-info-row %span.light Committed by %strong = commit_committer_link(@commit, avatar: true, size: 24) #{time_ago_with_tooltip(@commit.committed_date)} .commit-info-row %span.cgray= pluralize(@commit.parents.count, "parent") - @commit.parents.each do |parent| = link_to parent.short_id, namespace_project_commit_path(@project.namespace, @project, parent), class: "monospace" - if @ci_commit .pull-right = link_to ci_status_path(@ci_commit), class: "ci-status ci-#{@ci_commit.status}" do = ci_status_icon(@ci_commit) build: = ci_status_label(@ci_commit) .commit-info-row.branches %i.fa.fa-spinner.fa-spin .commit-box.content-block %h3.commit-title = markdown escape_once(@commit.title), pipeline: :single_line - if @commit.description.present? %pre.commit-description = preserve(markdown(escape_once(@commit.description), pipeline: :single_line)) :javascript $(".commit-info-row.branches").load("#{branches_namespace_project_commit_path(@project.namespace, @project, @commit.id)}"); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blame/0000755000175600017570000000000012672631600025437 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/blame/show.html.haml0000644000175600017570000000315212672631600030226 0ustar pravipravi- page_title "Blame", @blob.path, @ref - header_title project_title(@project, "Files", project_files_path(@project)) %h3.page-title Blame view #tree-holder.tree-holder .file-holder .file-title = blob_icon @blob.mode, @blob.name %strong = @path %small= number_to_human_size @blob.size .file-actions = render "projects/blob/actions" .file-content.blame.code.js-syntax-highlight %table - current_line = 1 - @blame_groups.each do |blame_group| %tr %td.blame-commit .commit - commit = blame_group[:commit] .commit-row-title %strong = link_to_gfm truncate(commit.title, length: 35), namespace_project_commit_path(@project.namespace, @project, commit.id), class: "cdark" .pull-right = link_to commit.short_id, namespace_project_commit_path(@project.namespace, @project, commit), class: "monospace"   .light = commit_author_link(commit, avatar: false) authored #{time_ago_with_tooltip(commit.committed_date, skip_js: true)} %td.line-numbers - line_count = blame_group[:lines].count - (current_line...(current_line + line_count)).each do |i| %a.diff-line-num= i \ - current_line += line_count %td.lines %pre.code.highlight %code - blame_group[:lines].each do |line| #{line} ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_github_import_modal.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_github_import_modal.ht0000644000175600017570000000074612672631600031112 0ustar pravipravi%div#github_import_modal.modal .modal-dialog .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from GitHub .modal-body To enable importing projects from GitHub, - if current_user.admin? as administrator you need to configure - else ask your Gitlab administrator to configure == #{link_to 'OAuth integration', help_page_path("integration", "github")}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/0000755000175600017570000000000012672631600025507 5ustar pravipravi././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_notes_with_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_notes_with_form.0000644000175600017570000000126512672631600031061 0ustar pravipravi%ul#notes-list.notes.main-notes-list.timeline = render "projects/notes/notes" .js-notes-busy .js-main-target-form - if can? current_user, :create_note, @project = render "projects/notes/form", view: diff_view - else .disabled-comment-area .disabled-profile .disabled-comment %span Please = link_to "register",new_user_session_path or = link_to "login",new_user_session_path to post a comment :javascript var notes = new Notes("#{namespace_project_notes_path(namespace_id: @project.namespace, target_id: @noteable.id, target_type: @noteable.class.name.underscore)}", #{@notes.map(&:id).to_json}, #{Time.now.to_i}, "#{diff_view}") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_note.html.haml0000644000175600017570000000534212672631600030425 0ustar pravipravi%li.timeline-entry{ id: dom_id(note), class: [dom_class(note), "note-row-#{note.id}", ('system-note' if note.system)] } .timeline-entry-inner .timeline-icon %a{href: user_path(note.author)} = image_tag avatar_icon(note.author), alt: '', class: 'avatar s40' .timeline-content .note-header - if note_editable?(note) .note-actions = link_to '#', title: 'Edit comment', class: 'js-note-edit' do = icon('pencil-square-o') = link_to namespace_project_note_path(note.project.namespace, note.project, note), title: 'Remove comment', method: :delete, data: { confirm: 'Are you sure you want to remove this comment?' }, remote: true, class: 'js-note-delete danger' do = icon('trash-o') - unless note.system - access = note.project.team.human_max_access(note.author.id) - if access %span.note-role.label = access = link_to_member(note.project, note.author, avatar: false) %span.author-username = '@' + note.author.username %span.note-last-update %a{name: dom_id(note), href: "##{dom_id(note)}", title: 'Link here'} = time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note_created_ago') - if note.updated_at != note.created_at %span · = icon('edit', title: 'edited') = time_ago_with_tooltip(note.updated_at, placement: 'bottom', html_class: 'note_edited_ago') - if note.updated_by && note.updated_by != note.author by #{link_to_member(note.project, note.updated_by, avatar: false, author_class: nil)} .note-body{class: note_editable?(note) ? 'js-task-list-container' : ''} .note-text = preserve do = markdown(note.note, pipeline: :note, cache_key: [note, "note"]) - if note_editable?(note) = render 'projects/notes/edit_form', note: note - if note.attachment.url .note-attachment - if note.attachment.image? = link_to note.attachment.url, target: '_blank' do = image_tag note.attachment.url, class: 'note-image-attach' .attachment = link_to note.attachment.url, target: '_blank' do = icon('paperclip') = note.attachment_identifier = link_to delete_attachment_namespace_project_note_path(note.project.namespace, note.project, note), title: 'Delete this attachment', method: :delete, remote: true, data: { confirm: 'Are you sure you want to remove the attachment?' }, class: 'danger js-note-attachment-delete' do = icon('trash-o', class: 'cred') .clear gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_hints.html.haml0000644000175600017570000000044412672631600030603 0ustar pravipravi.comment-hints.clearfix .pull-left = link_to 'Markdown', help_page_path('markdown', 'markdown'), target: '_blank', tabindex: -1 tip: = random_markdown_tip .pull-right = link_to '#', class: 'markdown-selector', tabindex: -1 do = icon('paperclip') Attach a file gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/0000755000175600017570000000000012672631600030055 5ustar pravipravi././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_diff.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_diff0000644000175600017570000000232512672631600031051 0ustar pravipravi- diff = note.diff - if diff .diff-file .diff-header %span - if diff.deleted_file = diff.old_path - else = diff.new_path - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}" .diff-content.code.js-syntax-highlight %table - note.truncated_diff_lines.each do |line| - type = line.type - line_code = generate_line_code(note.file_path, line) %tr.line_holder{ id: line_code, class: "#{type}" } - if type == "match" %td.old_line.diff-line-num= "..." %td.new_line.diff-line-num= "..." %td.line_content.match= line.text - else %td.old_line.diff-line-num = raw(type == "new" ? " " : line.old_pos) %td.new_line.diff-line-num = raw(type == "old" ? " " : line.new_pos) %td.line_content{class: "noteable_line #{type} #{line_code}", line_code: line_code}= diff_line_content(line.text) - if line_code == note.line_code = render "projects/notes/diff_notes_with_reply", notes: discussion_notes ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_commit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_comm0000644000175600017570000000230412672631600031071 0ustar pravipravi- note = discussion_notes.first .discussion.js-toggle-container{ class: note.discussion_id } .discussion-header .discussion-actions = link_to "#", class: "js-toggle-button" do %i.fa.fa-chevron-up Show/hide discussion %div = link_to_member(@project, note.author, avatar: false) started a discussion on commit = link_to(note.noteable.short_id, namespace_project_commit_path(note.project.namespace, note.project, note.noteable), class: 'monospace') .last-update.hide.js-toggle-content - last_note = discussion_notes.last last updated by = link_to_member(@project, last_note.author, avatar: false) %span.discussion-last-update #{time_ago_with_tooltip(last_note.updated_at, placement: 'bottom', html_class: 'discussion_updated_ago')} .discussion-body.js-toggle-content - if note.for_diff_line? = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note - else .panel.panel-default .notes{ data: { discussion_id: discussion_notes.first.discussion_id } } = render discussion_notes .discussion-reply-holder = link_to_reply_diff(discussion_notes.first) ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_active.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_acti0000644000175600017570000000170212672631600031057 0ustar pravipravi- note = discussion_notes.first .discussion.js-toggle-container{ class: note.discussion_id } .discussion-header .discussion-actions = link_to "#", class: "js-toggle-button" do %i.fa.fa-chevron-up Show/hide discussion %div = link_to_member(@project, note.author, avatar: false) started a discussion = link_to diffs_namespace_project_merge_request_path(note.project.namespace, note.project, note.noteable, anchor: note.line_code) do %strong on the diff .last-update.hide.js-toggle-content - last_note = discussion_notes.last last updated by = link_to_member(@project, last_note.author, avatar: false) %span.discussion-last-update #{time_ago_with_tooltip(last_note.updated_at, placement: 'bottom', html_class: 'discussion_updated_ago')} .discussion-body.js-toggle-content = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_outdated.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/discussions/_outd0000644000175600017570000000144412672631600031115 0ustar pravipravi- note = discussion_notes.first .discussion.js-toggle-container{ class: note.discussion_id } .discussion-header .discussion-actions = link_to "#", class: "js-toggle-button" do %i.fa.fa-chevron-down Show/hide discussion %div = link_to_member(@project, note.author, avatar: false) started a discussion on the %strong outdated diff %div - last_note = discussion_notes.last last updated by = link_to_member(@project, last_note.author, avatar: false) %span.discussion-last-update #{time_ago_with_tooltip(last_note.updated_at, placement: 'bottom', html_class: 'discussion_updated_ago')} .discussion-body.js-toggle-content.hide = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_notes.html.haml0000644000175600017570000000074312672631600030610 0ustar pravipravi- if @discussions.present? - @discussions.each do |discussion_notes| - note = discussion_notes.first - if note_for_main_target?(note) - next if note.cross_reference_not_visible_for?(current_user) = render discussion_notes - else = render 'projects/notes/discussion', discussion_notes: discussion_notes - else - @notes.each do |note| - next unless note.author - next if note.cross_reference_not_visible_for?(current_user) = render note gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_form.html.haml0000644000175600017570000000166712672631600030431 0ustar pravipravi= form_for [@project.namespace.becomes(Namespace), @project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form gfm-form" }, authenticity_token: true do |f| = hidden_field_tag :view, diff_view = hidden_field_tag :line_type = note_target_fields(@note) = f.hidden_field :commit_id = f.hidden_field :line_code = f.hidden_field :noteable_id = f.hidden_field :noteable_type = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text js-quick-submit' = render 'projects/notes/hints' .error-alert .note-form-actions.clearfix = f.submit 'Add Comment', class: "btn btn-nr btn-create comment-btn btn-grouped js-comment-button" = yield(:note_actions) %a.btn.btn-nr.btn-cancel.js-close-discussion-note-form Cancel ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_form_errors.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_form_errors.html0000644000175600017570000000012312672631600031067 0ustar pravipravi.error-message.js-errors - note.errors.full_messages.each do |msg| %div= msg ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_diff_notes_with_reply.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_diff_notes_with_0000644000175600017570000000070012672631600031100 0ustar pravipravi- note = notes.first # example note -# Check if line want not changed since comment was left - if !defined?(line) || line == note.diff_line %tr.notes_holder %td.notes_line{ colspan: 2 } %span.discussion-notes-count %i.fa.fa-comment = notes.count %td.notes_content %ul.notes{ data: { discussion_id: note.discussion_id } } = render notes .discussion-reply-holder = link_to_reply_diff(note) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_edit_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_edit_form.html.h0000644000175600017570000000117412672631600030735 0ustar pravipravi.note-edit-form = form_for note, url: namespace_project_note_path(@project.namespace, @project, note), method: :put, remote: true, authenticity_token: true do |f| = note_target_fields(note) = render layout: 'projects/md_preview', locals: { preview_class: 'md-preview' } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text js-task-list-field js-quick-submit' = render 'projects/notes/hints' .note-form-actions = f.submit 'Save Comment', class: 'btn btn-nr btn-save btn-grouped js-comment-button' = link_to 'Cancel', '#', class: 'btn btn-nr btn-cancel note-edit-cancel' ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_commit_discussion.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_commit_discussio0000644000175600017570000000000012672631600031134 0ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_discussion.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_discussion.html.0000644000175600017570000000124312672631600030775 0ustar pravipravi- note = discussion_notes.first .timeline-entry .timeline-entry-inner .timeline-icon = link_to user_path(note.author) do = image_tag avatar_icon(note.author_email), class: "avatar s40" .timeline-content - if note.for_merge_request? - (active_notes, outdated_notes) = discussion_notes.partition(&:active?) = render "projects/notes/discussions/active", discussion_notes: active_notes if active_notes.length > 0 = render "projects/notes/discussions/outdated", discussion_notes: outdated_notes if outdated_notes.length > 0 - else = render "projects/notes/discussions/commit", discussion_notes: discussion_notes ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_diff_notes_with_reply_parallel.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/notes/_diff_notes_with_0000644000175600017570000000162112672631600031103 0ustar pravipravi- note1 = notes_left.present? ? notes_left.first : nil - note2 = notes_right.present? ? notes_right.first : nil %tr.notes_holder - if note1 %td.notes_line.old %span.btn.disabled %i.fa.fa-comment = notes_left.count %td.notes_content.parallel.old %ul.notes{ data: { discussion_id: note1.discussion_id } } = render notes_left .discussion-reply-holder = link_to_reply_diff(note1, 'old') - else %td.notes_line.old= "" %td.notes_content.parallel.old= "" - if note2 %td.notes_line.new %span.btn.disabled %i.fa.fa-comment = notes_right.count %td.notes_content.parallel.new %ul.notes{ data: { discussion_id: note2.discussion_id } } = render notes_right .discussion-reply-holder = link_to_reply_diff(note2, 'new') - else %td.notes_line.new= "" %td.notes_content.parallel.new= "" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/_zen.html.haml0000644000175600017570000000056412672631600027125 0ustar pravipravi.zennable .zen-backdrop - classes << ' js-gfm-input js-autosize markdown-area' - if defined?(f) && f = f.text_area attr, class: classes - else = text_area_tag attr, nil, class: classes %a.js-zen-enter(tabindex="-1" href="#") = icon('expand') Edit in fullscreen %a.js-zen-leave(tabindex="-1" href="#") = icon('compress') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/0000755000175600017570000000000012672631600026144 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/new.html.haml0000644000175600017570000000236312672631600030547 0ustar pravipravi- page_title "New Branch" = render "projects/commits/header_title" - if @error .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × = @error %h3.page-title New Branch %hr = form_tag namespace_project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal js-create-branch-form js-requires-input" do .form-group = label_tag :branch_name, nil, class: 'control-label' .col-sm-10 = text_field_tag :branch_name, params[:branch_name], required: true, tabindex: 1, autofocus: true, class: 'form-control js-branch-name' .help-block.text-danger.js-branch-name-error .form-group = label_tag :ref, 'Create from', class: 'control-label' .col-sm-10 = text_field_tag :ref, params[:ref] || @project.default_branch, required: true, tabindex: 2, class: 'form-control' .help-block Existing branch name, tag, or commit SHA .form-actions = button_tag 'Create branch', class: 'btn btn-create', tabindex: 3 = link_to 'Cancel', namespace_project_branches_path(@project.namespace, @project), class: 'btn btn-cancel' :javascript var availableRefs = #{@project.repository.ref_names.to_json}; new NewBranchForm($('.js-create-branch-form'), availableRefs) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/_commit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/_commit.html.h0000644000175600017570000000055412672631600030713 0ustar pravipravi.branch-commit = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit-id monospace" · %span.str-truncated = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" · #{time_ago_with_tooltip(commit.committed_date)} ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/destroy.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/destroy.js.ham0000644000175600017570000000010012672631600030726 0ustar pravipravi$('.js-totalbranch-count').html("#{@repository.branches.size}") ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/index.html.ham0000644000175600017570000000223712672631600030711 0ustar pravipravi- page_title "Branches" = render "projects/commits/header_title" = render "projects/commits/head" .gray-content-block .pull-right - if can? current_user, :push_code, @project = link_to new_namespace_project_branch_path(@project.namespace, @project), class: 'btn btn-create' do = icon('plus') New branch   .dropdown.inline %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %span.light - if @sort.present? = @sort.humanize - else Name %b.caret %ul.dropdown-menu %li = link_to namespace_project_branches_path(sort: nil) do Name = link_to namespace_project_branches_path(sort: 'recently_updated') do = sort_title_recently_updated = link_to namespace_project_branches_path(sort: 'last_updated') do = sort_title_oldest_updated .oneline Protected branches can be managed in project settings - unless @branches.empty? %ul.content-list.all-branches - @branches.each do |branch| = render "projects/branches/branch", branch: branch = paginate @branches, theme: 'gitlab' ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/_branch.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/projects/branches/_branch.html.h0000644000175600017570000000471312672631600030661 0ustar pravipravi- commit = @repository.commit(branch.target) - bar_graph_width_factor = @max_commits > 0 ? 100.0/@max_commits : 0 - diverging_commit_counts = @repository.diverging_commit_counts(branch) - number_commits_behind = diverging_commit_counts[:behind] - number_commits_ahead = diverging_commit_counts[:ahead] %li(class="js-branch-#{branch.name}") %div = link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do %span.item-title.str-truncated= branch.name   - if branch.name == @repository.root_ref %span.label.label-primary default - elsif @repository.merged_to_root_ref? branch.name %span.label.label-info.has_tooltip(title="Merged into #{@repository.root_ref}") merged - if @project.protected_branch? branch.name %span.label.label-success %i.fa.fa-lock protected .controls.hidden-xs - if create_mr_button?(@repository.root_ref, branch.name) = link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-grouped btn-xs' do = icon('plus') Merge Request - if branch.name != @repository.root_ref = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: branch.name), class: 'btn btn-grouped btn-xs', method: :post, title: "Compare" do = icon("exchange") Compare - if can_remove_branch?(@project, branch.name) = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), class: 'btn btn-grouped btn-xs btn-remove remove-row has_tooltip', title: "Delete branch", method: :delete, data: { confirm: "Deleting the '#{branch.name}' branch cannot be undone. Are you sure?", container: 'body' }, remote: true do = icon("trash-o") - if branch.name != @repository.root_ref .divergence-graph{ title: "#{number_commits_ahead} commits ahead, #{number_commits_behind} commits behind #{@repository.root_ref}" } .graph-side .bar.bar-behind{ style: "width: #{number_commits_behind * bar_graph_width_factor}%" } %span.count.count-behind= number_commits_behind .graph-separator .graph-side .bar.bar-ahead{ style: "width: #{number_commits_ahead * bar_graph_width_factor}%" } %span.count.count-ahead= number_commits_ahead - if commit = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this branch gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/0000755000175600017570000000000012672631600024351 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/accounts/0000755000175600017570000000000012672631600026170 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/accounts/show.html.haml0000644000175600017570000001120412672631600030754 0ustar pravipravi- page_title "Account" - header_title page_title, profile_account_path - if current_user.ldap_user? .alert.alert-info Some options are unavailable for LDAP accounts .account-page.prepend-top-default .panel.panel-default.update-token .panel-heading Reset Private token .panel-body = form_for @user, url: reset_private_token_profile_path, method: :put do |f| .data %p Your private token is used to access application resources without authentication. %br It can be used for atom feeds or the API. %span.cred Keep it secret! %p.cgray - if current_user.private_token = text_field_tag "token", current_user.private_token, class: "form-control" - else %span You don`t have one yet. Click generate to fix it. .form-actions - if current_user.private_token = f.submit 'Reset private token', data: { confirm: "Are you sure?" }, class: "btn btn-default" - else = f.submit 'Generate', class: "btn btn-default" .panel.panel-default .panel-heading Two-factor Authentication .panel-body - if current_user.two_factor_enabled? .pull-right = link_to 'Disable Two-factor Authentication', profile_two_factor_auth_path, method: :delete, class: 'btn btn-close btn-sm', data: { confirm: 'Are you sure?' } %p.text-success %strong Two-factor Authentication is enabled %p If you lose your recovery codes you can %strong = succeed ',' do = link_to 'generate new ones', codes_profile_two_factor_auth_path, method: :post, data: { confirm: 'Are you sure?' } invalidating all previous codes. - else %p Increase your account's security by enabling two-factor authentication (2FA). %p Each time you log in you’ll be required to provide your username and password as usual, plus a randomly-generated code from your phone. .form-actions = link_to 'Enable Two-factor Authentication', new_profile_two_factor_auth_path, class: 'btn btn-success' - if button_based_providers.any? .panel.panel-default .panel-heading Connected Accounts .panel-body .oauth-buttons.append-bottom-10 %p Click on icon to activate signin with one of the following services - button_based_providers.each do |provider| .btn-group = link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: "btn btn-lg #{'active' if auth_active?(provider)}", "data-no-turbolink" => "true" - if auth_active?(provider) = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do = icon('close') - if current_user.can_change_username? .panel.panel-warning.update-username .panel-heading Change Username .panel-body = form_for @user, url: update_username_profile_path, method: :put, remote: true do |f| %p Changing your username will change path to all personal projects! %div .input-group .input-group-addon = "#{root_url}u/" = f.text_field :username, required: true, class: 'form-control'   .loading-gif.hide %p = icon('spinner spin') Saving new username .form-actions = f.submit 'Save username', class: "btn btn-warning" - if signup_enabled? .panel.panel-danger.remove-account .panel-heading Remove account .panel-body - if @user.can_be_removed? %p Deleting an account has the following effects: %ul %li All user content like authored issues, snippets, comments will be removed - rp = current_user.personal_projects.count - unless rp.zero? %li #{pluralize rp, 'personal project'} will be removed and cannot be restored .form-actions = link_to 'Delete account', user_registration_path, data: { confirm: "REMOVE #{current_user.name}? Are you sure?" }, method: :delete, class: "btn btn-remove" - else - if @user.solo_owned_groups.present? %p Your account is currently an owner in these groups: %strong #{@user.solo_owned_groups.map(&:name).join(', ')} %p You must transfer ownership or delete these groups before you can delete your account. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/emails/0000755000175600017570000000000012672631600025623 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/emails/index.html.haml0000644000175600017570000000325212672631600030542 0ustar pravipravi- page_title "Emails" - header_title page_title, profile_emails_path .alert.alert-help.prepend-top-default %ul %li Your %b Primary Email will be used for avatar detection and web based operations, such as edits and merges. %li Your %b Notification Email will be used for account notifications. %li Your %b Public Email will be displayed on your public profile. %li All email addresses will be used to identify your commits. .panel.panel-default .panel-heading Emails (#{@emails.count + 1}) %ul.well-list#emails-table %li %strong= @primary %span.label.label-success Primary Email - if @primary === current_user.public_email %span.label.label-info Public Email - if @primary === current_user.notification_email %span.label.label-info Notification Email - @emails.each do |email| %li %strong= email.email - if email.email === current_user.public_email %span.label.label-info Public Email - if email.email === current_user.notification_email %span.label.label-info Notification Email %span.cgray added #{time_ago_with_tooltip(email.created_at)} = link_to 'Remove', profile_email_path(email), data: { confirm: 'Are you sure?'}, method: :delete, class: 'btn btn-sm btn-remove pull-right' %h4 Add email address = form_for 'email', url: profile_emails_path, html: { class: 'form-horizontal' } do |f| .form-group = f.label :email, class: 'control-label' .col-sm-10 = f.text_field :email, class: 'form-control' .form-actions = f.submit 'Add email address', class: 'btn btn-create' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/preferences/0000755000175600017570000000000012672631600026652 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/preferences/update.js.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/preferences/update.js.e0000644000175600017570000000110512672631600030712 0ustar pravipravi// Remove body class for any previous theme, re-add current one $('body').removeClass('<%= Gitlab::Themes.body_classes %>') $('body').addClass('<%= user_application_theme %>') // Toggle container-fluid class if ('<%= current_user.layout %>' === 'fluid') { $('.content-wrapper').find('.container-fluid').removeClass('container-limited') } else { $('.content-wrapper').find('.container-fluid').addClass('container-limited') } // Re-enable the "Save" button $('input[type=submit]').enable() // Show the notice flash message new Flash('<%= flash.discard(:notice) %>', 'notice') ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/preferences/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/preferences/show.html.h0000644000175600017570000000421612672631600030751 0ustar pravipravi- page_title 'Preferences' - header_title page_title, profile_preferences_path .alert.alert-help.prepend-top-default These settings allow you to customize the appearance and behavior of the site. They are saved with your account and will persist to any device you use to access the site. = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form form-horizontal'} do |f| .panel.panel-default.application-theme .panel-heading Application theme .panel-body - Gitlab::Themes.each do |theme| = label_tag do .preview{class: theme.css_class} = f.radio_button :theme_id, theme.id = theme.name .panel.panel-default.syntax-theme .panel-heading Syntax highlighting theme .panel-body - Gitlab::ColorSchemes.each do |scheme| = label_tag do .preview= image_tag "#{scheme.css_class}-scheme-preview.png" = f.radio_button :color_scheme_id, scheme.id = scheme.name .panel.panel-default .panel-heading Behavior .panel-body .form-group = f.label :layout, class: 'control-label' do Layout width .col-sm-10 = f.select :layout, layout_choices, {}, class: 'form-control' .help-block Choose between fixed (max. 1200px) and fluid (100%) application layout. .form-group = f.label :dashboard, class: 'control-label' do Default Dashboard = link_to('(?)', help_page_path('profile', 'preferences') + '#default-dashboard', target: '_blank') .col-sm-10 = f.select :dashboard, dashboard_choices, {}, class: 'form-control' .form-group = f.label :project_view, class: 'control-label' do Project view = link_to('(?)', help_page_path('profile', 'preferences') + '#default-project-view', target: '_blank') .col-sm-10 = f.select :project_view, project_view_choices, {}, class: 'form-control' .help-block Choose what content you want to see on a project's home page. .panel-footer = f.submit 'Save changes', class: 'btn btn-save' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/applications.html.haml0000644000175600017570000000473712672631600030660 0ustar pravipravi- page_title "Applications" - header_title page_title, applications_profile_path .alert.alert-help.prepend-top-default - if user_oauth_applications? Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account. - else Manage applications that you've authorized to use your account. - if user_oauth_applications? .oauth-applications %h3 Your applications .pull-right = link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' - if @applications.any? .table-holder %table.table.table-striped %thead %tr %th Name %th Callback URL %th Clients %th %th %tbody - @applications.each do |application| %tr{:id => "application_#{application.id}"} %td= link_to application.name, oauth_application_path(application) %td - application.redirect_uri.split.each do |uri| %div= uri %td= application.access_tokens.count %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link btn-sm' %td= render 'doorkeeper/applications/delete_form', application: application .oauth-authorized-applications.prepend-top-20 - if user_oauth_applications? %h3 Authorized applications - if @authorized_tokens.any? .table-holder %table.table.table-striped %thead %tr %th Name %th Authorized At %th Scope %th %tbody - @authorized_apps.each do |app| - token = app.authorized_tokens.order('created_at desc').first %tr{:id => "application_#{app.id}"} %td= app.name %td= token.created_at %td= token.scopes %td= render 'doorkeeper/authorized_applications/delete_form', application: app - @authorized_anonymous_tokens.each do |token| %tr %td Anonymous %div.help-block %em Authorization was granted by entering your username and password in the application. %td= token.created_at %td= token.scopes %td= render 'doorkeeper/authorized_applications/delete_form', token: token - else %p.light You don't have any authorized applications gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/update_username.js.haml0000644000175600017570000000027212672631600031011 0ustar pravipravi- if @user.valid? :plain new Flash("Username sucessfully changed", "notice") - else :plain new Flash("Username change failed - #{@user.errors.full_messages.first}", "alert") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/0000755000175600017570000000000012672631600025324 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/new.html.haml0000644000175600017570000000101712672631600027722 0ustar pravipravi- page_title "Add SSH Keys" %h3.page-title Add an SSH Key %p.light Paste your public key here. Read more about how to generate a key on #{link_to "the SSH help page", help_page_path("ssh", "README")}. %hr = render 'form' :javascript $('#key_key').on('focusout', function(){ var title = $('#key_title'), val = $('#key_key').val(), comment = val.match(/^\S+ \S+ (.+)\n?$/); if( comment && comment.length > 1 && title.val() == '' ){ $('#key_title').val( comment[1] ).change(); } }); ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_key_table.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_key_table.html.ha0000644000175600017570000000072512672631600030703 0ustar pravipravi- is_admin = defined?(admin) ? true : false - if @keys.any? .table-holder %table.table %thead.panel-heading %tr %th Title %th Fingerprint %th Added at %th %tbody - @keys.each do |key| = render 'profiles/keys/key', key: key, is_admin: is_admin - else .nothing-here-block - if is_admin User has no ssh keys - else There are no SSH keys with access to your account. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/index.html.haml0000644000175600017570000000054612672631600030246 0ustar pravipravi- page_title "SSH Keys" - header_title page_title, profile_keys_path .top-area .nav-text Before you can add an SSH key you need to = link_to "generate it.", help_page_path("ssh", "README") .nav-controls = link_to new_profile_key_path, class: "btn btn-new" do = icon('plus') Add SSH Key .prepend-top-default = render 'key_table' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_key.html.haml0000644000175600017570000000055612672631600030067 0ustar pravipravi%tr %td = link_to path_to_key(key, is_admin) do %strong= key.title %td %code.key-fingerprint= key.fingerprint %td %span.cgray added #{time_ago_with_tooltip(key.created_at)} %td = link_to 'Remove', path_to_key(key, is_admin), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-sm btn-remove delete-key pull-right" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_form.html.haml0000644000175600017570000000125412672631600030236 0ustar pravipravi%div = form_for [:profile, @key], html: { class: 'form-horizontal js-requires-input' } do |f| - if @key.errors.any? .alert.alert-danger %ul - @key.errors.full_messages.each do |msg| %li= msg .form-group = f.label :key, class: 'control-label' .col-sm-10 = f.text_area :key, class: "form-control", rows: 8, autofocus: true, required: true .form-group = f.label :title, class: 'control-label' .col-sm-10= f.text_field :title, class: "form-control", required: true .form-actions = f.submit 'Add key', class: "btn btn-create" = link_to "Cancel", profile_keys_path, class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/show.html.haml0000644000175600017570000000007312672631600030112 0ustar pravipravi- page_title @key.title, "SSH Keys" = render "key_details" ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_key_details.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/keys/_key_details.html.0000644000175600017570000000114312672631600030723 0ustar pravipravi- is_admin = defined?(admin) ? true : false .row .col-md-4 .panel.panel-default .panel-heading SSH Key %ul.well-list %li %span.light Title: %strong= @key.title %li %span.light Created on: %strong= @key.created_at.to_s(:medium) .col-md-8 %p %span.light Fingerprint: %code.key-fingerprint= @key.fingerprint %pre.well-pre = @key.key .col-md-12 .pull-right = link_to 'Remove', path_to_key(@key, is_admin), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/0000755000175600017570000000000012672631600027222 5ustar pravipravi././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/_settings.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/_settings0000644000175600017570000000143712672631600031151 0ustar pravipravi%li %span.notification.fa.fa-holder - if notification.global? = notification_icon(@notification) - else = notification_icon(notification) %span.str-truncated - if membership.kind_of? GroupMember = link_to membership.group.name, membership.group - else = link_to_project(membership.project) .pull-right = form_tag profile_notifications_path, method: :put, remote: true, class: 'update-notifications' do = hidden_field_tag :notification_type, type, id: dom_id(membership, 'notification_type') = hidden_field_tag :notification_id, membership.id, id: dom_id(membership, 'notification_id') = select_tag :notification_level, options_for_select(Notification.options_with_labels, notification.level), class: 'form-control trigger-submit' ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/update.js.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/update.js0000644000175600017570000000022212672631600031036 0ustar pravipravi- if @saved :plain new Flash("Notification settings saved", "notice") - else :plain new Flash("Failed to save new settings", "alert") ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/notifications/show.html0000644000175600017570000000544012672631600031073 0ustar pravipravi- page_title "Notifications" - header_title page_title, profile_notifications_path .prepend-top-default = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| -if @user.errors.any? %div.alert.alert-danger %ul - @user.errors.full_messages.each do |msg| %li= msg = hidden_field_tag :notification_type, 'global' .form-group = f.label :notification_email, class: "control-label" .col-sm-10 = f.select :notification_email, @user.all_emails, { include_blank: false }, class: "form-control" .form-group = f.label :notification_level, class: 'control-label' .col-sm-10 .radio = f.label :notification_level, value: Notification::N_DISABLED do = f.radio_button :notification_level, Notification::N_DISABLED .level-title Disabled %p You will not get any notifications via email .radio = f.label :notification_level, value: Notification::N_MENTION do = f.radio_button :notification_level, Notification::N_MENTION .level-title On Mention %p You will receive notifications only for comments in which you were @mentioned .radio = f.label :notification_level, value: Notification::N_PARTICIPATING do = f.radio_button :notification_level, Notification::N_PARTICIPATING .level-title Participating %p You will only receive notifications from related resources (e.g. from your commits or assigned issues) .radio = f.label :notification_level, value: Notification::N_WATCH do = f.radio_button :notification_level, Notification::N_WATCH .level-title Watch %p You will receive notifications for any activity .gray-content-block = f.submit 'Save changes', class: "btn btn-create" .row.all-notifications.prepend-top-default .col-md-6 %p You can also specify notification level per group or per project. %br By default, all projects and groups will use the notification level set above. %h4 Groups: %ul.bordered-list - @group_members.each do |group_member| - notification = Notification.new(group_member) = render 'settings', type: 'group', membership: group_member, notification: notification .col-md-6 %p To specify the notification level per project of a group you belong to, %br you need to be a member of the project itself, not only its group. %h4 Projects: %ul.bordered-list - @project_members.each do |project_member| - notification = Notification.new(project_member) = render 'settings', type: 'project', membership: project_member, notification: notification gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/passwords/0000755000175600017570000000000012672631600026376 5ustar pravipravi././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/passwords/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/passwords/edit.html.ham0000644000175600017570000000313212672631600030754 0ustar pravipravi- page_title "Password" - header_title page_title, edit_profile_password_path .alert.alert-help.prepend-top-default - if @user.password_automatically_set? Set your password. - else Change your password or recover your current one. .update-password.prepend-top-default = form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f| %div %p.slead - unless @user.password_automatically_set? You must provide current password in order to change it. %br After a successful password update, you will be redirected to the login page where you can log in with your new password. -if @user.errors.any? .alert.alert-danger %ul - @user.errors.full_messages.each do |msg| %li= msg - unless @user.password_automatically_set? .form-group = f.label :current_password, class: 'control-label' .col-sm-10 = f.password_field :current_password, required: true, class: 'form-control' %div = link_to "Forgot your password?", reset_profile_password_path, method: :put .form-group = f.label :password, 'New password', class: 'control-label' .col-sm-10 = f.password_field :password, required: true, class: 'form-control' .form-group = f.label :password_confirmation, class: 'control-label' .col-sm-10 = f.password_field :password_confirmation, required: true, class: 'form-control' .form-actions = f.submit 'Save password', class: "btn btn-create" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/passwords/new.html.haml0000644000175600017570000000207612672631600031002 0ustar pravipravi- page_title "New Password" - header_title "New Password" %h3.page-title Setup new password %hr = form_for @user, url: profile_password_path, method: :post, html: { class: 'form-horizontal '} do |f| %p.slead Please set a new password before proceeding. %br After a successful password update you will be redirected to login screen. -if @user.errors.any? .alert.alert-danger %ul - @user.errors.full_messages.each do |msg| %li= msg - unless @user.password_automatically_set? .form-group = f.label :current_password, class: 'control-label' .col-sm-10= f.password_field :current_password, required: true, class: 'form-control' .form-group = f.label :password, class: 'control-label' .col-sm-10= f.password_field :password, required: true, class: 'form-control' .form-group = f.label :password_confirmation, class: 'control-label' .col-sm-10 = f.password_field :password_confirmation, required: true, class: 'form-control' .form-actions = f.submit 'Set new password', class: "btn btn-create" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/audit_log.html.haml0000644000175600017570000000031512672631600030125 0ustar pravipravi- page_title "Audit Log" - header_title page_title, audit_log_profile_path .alert.alert-help.prepend-top-default History of authentications .prepend-top-default = render 'event_table', events: @events gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/_event_table.html.haml0000644000175600017570000000056112672631600030610 0ustar pravipravi.table-holder %table.table#audits %thead %tr %th Action %th When %tbody - events.each do |event| %tr %td %span Signed in with %b= event.details[:with] authentication %td #{time_ago_in_words event.created_at} ago = paginate events, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/show.html.haml0000644000175600017570000001077212672631600027146 0ustar pravipravi.alert.alert-help.prepend-top-default This information will appear on your profile. - if current_user.ldap_user? Some options are unavailable for LDAP accounts .prepend-top-default = form_for @user, url: profile_path, method: :put, html: { multipart: true, class: "edit_user form-horizontal" }, authenticity_token: true do |f| -if @user.errors.any? %div.alert.alert-danger %ul - @user.errors.full_messages.each do |msg| %li= msg .row .col-md-7 .form-group = f.label :name, class: "control-label" .col-sm-10 = f.text_field :name, class: "form-control", required: true %span.help-block Enter your name, so people you know can recognize you. .form-group = f.label :email, class: "control-label" .col-sm-10 - if @user.ldap_user? && @user.ldap_email? = f.text_field :email, class: "form-control", required: true, readonly: true %span.help-block.light Your email address was automatically set based on the LDAP server. - else - if @user.temp_oauth_email? = f.text_field :email, class: "form-control", required: true, value: nil - else = f.text_field :email, class: "form-control", required: true - if @user.unconfirmed_email.present? %span.help-block Please click the link in the confirmation email before continuing. It was sent to = succeed "." do %strong #{@user.unconfirmed_email} %p = link_to "Resend confirmation e-mail", user_confirmation_path(user: { email: @user.unconfirmed_email }), method: :post - else %span.help-block We also use email for avatar detection if no avatar is uploaded. .form-group = f.label :public_email, class: "control-label" .col-sm-10 = f.select :public_email, options_for_select(@user.all_emails, selected: @user.public_email), {include_blank: 'Do not show on profile'}, class: "select2" %span.help-block This email will be displayed on your public profile. .form-group = f.label :skype, class: "control-label" .col-sm-10= f.text_field :skype, class: "form-control" .form-group = f.label :linkedin, class: "control-label" .col-sm-10= f.text_field :linkedin, class: "form-control" .form-group = f.label :twitter, class: "control-label" .col-sm-10= f.text_field :twitter, class: "form-control" .form-group = f.label :website_url, 'Website', class: "control-label" .col-sm-10= f.text_field :website_url, class: "form-control" .form-group = f.label :location, 'Location', class: "control-label" .col-sm-10= f.text_field :location, class: "form-control" .form-group = f.label :bio, class: "control-label" .col-sm-10 = f.text_area :bio, rows: 4, class: "form-control", maxlength: 250 %span.help-block Tell us about yourself in fewer than 250 characters. .col-md-5 .light-well = image_tag avatar_icon(@user, 160), alt: '', class: 'avatar s160' .clearfix .profile-avatar-form-option %p.light - if @user.avatar? You can change your avatar here - if Gitlab.config.gravatar.enabled %br or remove the current avatar to revert to #{link_to Gitlab.config.gravatar.host, "http://" + Gitlab.config.gravatar.host} - else You can upload an avatar here - if Gitlab.config.gravatar.enabled %br or change it at #{link_to Gitlab.config.gravatar.host, "http://" + Gitlab.config.gravatar.host} %hr %a.choose-btn.btn.btn-sm.js-choose-user-avatar-button %i.fa.fa-paperclip %span Choose File ...   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: "js-user-avatar-input hidden" .light The maximum file size allowed is 200KB. - if @user.avatar? %hr = link_to 'Remove avatar', profile_avatar_path, data: { confirm: "Avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" .form-actions = f.submit 'Save changes', class: "btn btn-success" = link_to "Cancel", user_path(current_user), class: "btn btn-cancel" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/0000755000175600017570000000000012672631600027724 5ustar pravipravi././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/new.ht0000644000175600017570000000251512672631600031055 0ustar pravipravi- page_title 'Two-factor Authentication', 'Account' %h2.page-title Two-factor Authentication (2FA) %p Download the Google Authenticator application from App Store for iOS or Google Play for Android and scan this code. More information is available in the #{link_to('documentation', help_page_path('profile', 'two_factor_authentication'))}. %hr = form_tag profile_two_factor_auth_path, method: :post, class: 'form-horizontal two-factor-new' do |f| - if @error .alert.alert-danger = @error .form-group .col-lg-2.col-lg-offset-2 = raw @qr_code .col-lg-7.col-lg-offset-1.manual-instructions %h3 Can't scan the code? %p To add the entry manually, provide the following details to the application on your phone. %dl %dt Account %dd= current_user.email %dl %dt Key %dd= current_user.otp_secret.scan(/.{4}/).join(' ') %dl %dt Time based %dd Yes .form-group = label_tag :pin_code, nil, class: "control-label" .col-lg-10 = text_field_tag :pin_code, nil, class: "form-control", required: true, autofocus: true .form-actions = submit_tag 'Submit', class: 'btn btn-success' = link_to 'Configure it later', skip_profile_two_factor_auth_path, :method => :patch, class: 'btn btn-cancel' if two_factor_skippable? ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/create.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/create0000644000175600017570000000023312672631600031110 0ustar pravipravi- page_title 'Two-factor Authentication', 'Account' .alert.alert-success Congratulations! You have enabled Two-factor Authentication! = render 'codes' ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/_codes.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/_codes0000644000175600017570000000056512672631600031111 0ustar pravipravi%p.slead Should you ever lose your phone, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %b will lose access to your account. .codes.well %ul - @codes.each do |code| %li %span.monospace= code = link_to 'Proceed', profile_account_path, class: 'btn btn-success' ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/codes.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/profiles/two_factor_auths/codes.0000644000175600017570000000021112672631600031014 0ustar pravipravi- page_title 'Recovery Codes', 'Two-factor Authentication' %h3.page-title Two-factor Authentication Recovery codes %hr = render 'codes' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/0000755000175600017570000000000012672631600024036 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_user_email.html.haml0000644000175600017570000000075112672631600030645 0ustar pravipravi%p Hi #{@user['name']}! %p - if Gitlab.config.gitlab.signup_enabled Your account has been created successfully. - else The Administrator created an account for you. Now you are a member of the company GitLab application. %p login.......................................... %code= @user['email'] - if @user.created_by_id %p = link_to "Click here to set your password", edit_password_url(@user, reset_password_token: @token) %p = raw reset_token_expire_message ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_commit_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_commit_email.text.er0000644000175600017570000000035012672631600031033 0ustar pravipraviNew comment for Commit <%= @commit.short_id %> <%= url_for(namespace_project_commit_url(@note.project.namespace, @note.project, id: @commit.id, anchor: "note_#{@note.id}")) %> Author: <%= @note.author_name %> <%= @note.note %> gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_fail_email.text.erb0000644000175600017570000000060712672631600030757 0ustar pravipraviBuild failed for <%= @project.name %> Status: <%= @build.status %> Commit: <%= @build.commit.short_sha %> Author: <%= @build.commit.git_author_name %> Branch: <%= @build.ref %> Stage: <%= @build.stage %> Job: <%= @build.name %> Message: <%= @build.commit.git_commit_message %> Url: <%= namespace_project_build_url(@build.project.namespace, @build.project, @build) %> ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_issue_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_issue_email.ht0000644000175600017570000000006712672631600031101 0ustar pravipravi= render 'reassigned_issuable_email', issuable: @issue ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_merge_request_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_merge_request_0000644000175600017570000000007712672631600031177 0ustar pravipravi= render 'reassigned_issuable_email', issuable: @merge_request ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_merge_request_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_merge_request_email.0000644000175600017570000000042012672631600031076 0ustar pravipraviNew comment for Merge Request <%= @merge_request.iid %> <%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")) %> <%= @note.author_name %> <%= @note.note %> ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_member_invited_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_member_invited_emai0000644000175600017570000000051112672631600031156 0ustar pravipravi%p You have been invited - if inviter = @group_member.created_by by = link_to inviter.name, user_url(inviter) to join group = link_to @group.name, group_url(@group) as #{@group_member.human_access}. %p = link_to 'Accept invitation', invite_url(@token) or = link_to 'decline', decline_invite_url(@token) ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_ssh_key_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_ssh_key_email.html.ha0000644000175600017570000000031612672631600031000 0ustar pravipravi%p Hi #{@user.name}! %p A new public key was added to your account: %p title: %code= @key.title %p If this key was added in error, you can remove it under = link_to "SSH Keys", profile_keys_url ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_merge_request_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_merge_request_email.h0000644000175600017570000000065612672631600031105 0ustar pravipravi- if current_application_settings.email_author_in_body %div #{link_to @merge_request.author_name, user_url(@merge_request.author)} wrote: %p.details != merge_path_description(@merge_request, '→') - if @merge_request.assignee_id.present? %p Assignee: #{@merge_request.author_name} → #{@merge_request.assignee_name} -if @merge_request.description = markdown(@merge_request.description, pipeline: :email) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merge_request_status_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merge_request_status_emai0000644000175600017570000000012712672631600031226 0ustar pravipravi%p = "Merge Request ##{@merge_request.iid} was #{@mr_status} by #{@updated_by.name}" ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merged_merge_request_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merged_merge_request_emai0000644000175600017570000000007112672631600031144 0ustar pravipravi%p = "Merge Request ##{@merge_request.iid} was merged" ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_merge_request_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_merge_request_emai0000644000175600017570000000012012672631600031145 0ustar pravipravi%p = "Merge Request ##{@merge_request.iid} was closed by #{@updated_by.name}" ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_success_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_success_email.text.0000644000175600017570000000061312672631600031020 0ustar pravipraviBuild successful for <%= @project.name %> Status: <%= @build.status %> Commit: <%= @build.commit.short_sha %> Author: <%= @build.commit.git_author_name %> Branch: <%= @build.ref %> Stage: <%= @build.stage %> Job: <%= @build.name %> Message: <%= @build.commit.git_commit_message %> Url: <%= namespace_project_build_url(@build.project.namespace, @build.project, @build) %> ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_issue_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_issue_email.html.h0000644000175600017570000000006112672631600030777 0ustar pravipravi%p = "Issue was closed by #{@updated_by.name}" ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_merge_request_email.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_merge_request_emai0000644000175600017570000000053712672631600031161 0ustar pravipravi= "Merge Request ##{@merge_request.iid} was closed by #{@updated_by.name}" Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') Author: #{@merge_request.author_name} Assignee: #{@merge_request.assignee_name} ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_success_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_success_email.html.0000644000175600017570000000136412672631600031004 0ustar pravipravi- content_for :header do %h1{style: "background: #38CF5B; color: #FFF; font: normal 20px Helvetica, Arial, sans-serif; margin: 0; padding: 5px 10px; line-height: 32px; font-size: 16px;"} GitLab (build successful) %h3 Project: = link_to namespace_project_url(@project.namespace, @project) do = @project.name %p Commit: #{link_to @build.short_sha, namespace_project_commit_url(@build.project.namespace, @build.project, @build.sha)} %p Author: #{@build.commit.git_author_name} %p Branch: #{@build.ref} %p Stage: #{@build.stage} %p Job: #{@build.name} %p Message: #{@build.commit.git_commit_message} %p Build details: #{link_to "Build #{@build.id}", namespace_project_build_url(@build.project.namespace, @build.project, @build)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_email_email.text.erb0000644000175600017570000000030012672631600030613 0ustar pravipraviHi <%= @user.name %>! A new email was added to your account: email.................. <%= @email.email %> If this email was added in error, you can remove it here: <%= profile_emails_url %> ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/_reassigned_issuable_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/_reassigned_issuable_emai0000644000175600017570000000030712672631600031126 0ustar pravipravi%p Assignee changed - if @previous_assignee from %strong #{@previous_assignee.name} to - if issuable.assignee_id %strong #{issuable.assignee_name} - else %strong Unassigned ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_accepted_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_accepted_ema0000644000175600017570000000032012672631600031140 0ustar pravipravi%p #{@group_member.invite_email}, now known as #{link_to @group_member.user.name, user_url(@group_member.user)}, has accepted your invitation to join group #{link_to @group.name, group_url(@group)}. ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_member_invited_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_member_invited_em0000644000175600017570000000060212672631600031157 0ustar pravipravi%p You have been invited - if inviter = @project_member.created_by by = link_to inviter.name, user_url(inviter) to join project = link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project) as #{@project_member.human_access}. %p = link_to 'Accept invitation', invite_url(@token) or = link_to 'decline', decline_invite_url(@token) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merged_merge_request_email.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merged_merge_request_emai0000644000175600017570000000051012672631600031142 0ustar pravipravi= "Merge Request ##{@merge_request.iid} was merged" Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') Author: #{@merge_request.author_name} Assignee: #{@merge_request.assignee_name} ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_ssh_key_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_ssh_key_email.text.er0000644000175600017570000000025312672631600031036 0ustar pravipraviHi <%= @user.name %>! A new public key was added to your account: Title: <%= @key.title %> If this key was added in error, you can remove it at <%= profile_keys_url %> ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_was_moved_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_was_moved_email.t0000644000175600017570000000056012672631600031105 0ustar pravipraviProject <%= @old_path_with_namespace %> was moved to another location The project is now located under <%= namespace_project_url(@project.namespace, @project) %> To update the remote url in your local repository run (for ssh): git remote set-url origin <%= @project.ssh_url_to_repo %> or for http(s): git remote set-url origin <%= @project.http_url_to_repo %> ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_accepted_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_accepted_ema0000644000175600017570000000025112672631600031143 0ustar pravipravi<%= @group_member.invite_email %>, now known as <%= @group_member.user.name %>, has accepted your invitation to join group <%= @group.name %>. <%= group_url(@group) %> ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_access_granted_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_access_granted_em0000644000175600017570000000027212672631600031136 0ustar pravipravi%p = "You have been granted #{@project_member.human_access} access to project" %p = link_to namespace_project_url(@project.namespace, @project) do = @project.name_with_namespace ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/issue_status_changed_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/issue_status_changed_emai0000644000175600017570000000007312672631600031160 0ustar pravipravi%p = "Issue was #{@issue_status} by #{@updated_by.name}" ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_was_moved_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_was_moved_email.h0000644000175600017570000000106312672631600031070 0ustar pravipravi%p Project #{@old_path_with_namespace} was moved to another location %p The project is now located under = link_to namespace_project_url(@project.namespace, @project) do = @project.name_with_namespace %p To update the remote url in your local repository run (for ssh): %p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } git remote set-url origin #{@project.ssh_url_to_repo} %p or for http(s): %p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } git remote set-url origin #{@project.http_url_to_repo} %br ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_access_granted_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_access_granted_em0000644000175600017570000000026612672631600031141 0ustar pravipravi You have been granted <%= @project_member.human_access %> access to project <%= @project.name_with_namespace %> <%= url_for(namespace_project_url(@project.namespace, @project)) %> ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_issue_email.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/closed_issue_email.text.h0000644000175600017570000000022412672631600031020 0ustar pravipravi= "Issue was closed by #{@updated_by.name}" Issue ##{@issue.iid}: #{namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_issue_email.text.erb0000644000175600017570000000033212672631600031035 0ustar pravipraviNew comment for Issue <%= @issue.iid %> <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue, anchor: "note_#{@note.id}")) %> Author: <%= @note.author_name %> <%= @note.note %> ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_merge_request_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_merge_request_0000644000175600017570000000010412672631600031166 0ustar pravipravi<%= render 'reassigned_issuable_email', issuable: @merge_request %> ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_issue_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_issue_email.html.ham0000644000175600017570000000003012672631600031005 0ustar pravipravi= render 'note_message' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_email_email.html.haml0000644000175600017570000000031512672631600030752 0ustar pravipravi%p Hi #{@user.name}! %p A new email was added to your account: %p email: %code= @email.email %p If this email was added in error, you can remove it here: = link_to "Emails", profile_emails_url ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_accepted_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_accepted_e0000644000175600017570000000034212672631600031140 0ustar pravipravi<%= @project_member.invite_email %>, now known as <%= @project_member.user.name %>, has accepted your invitation to join project <%= @project.name_with_namespace %>. <%= namespace_project_url(@project.namespace, @project) %> ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/issue_status_changed_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/issue_status_changed_emai0000644000175600017570000000026312672631600031161 0ustar pravipraviIssue was <%= @issue_status %> by <%= @updated_by.name %> Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_declined_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_declined_ema0000644000175600017570000000016112672631600031142 0ustar pravipravi%p #{@invite_email} has declined your invitation to join group #{link_to @group.name, group_url(@group)}. ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_member_invited_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_member_invited_em0000644000175600017570000000044312672631600031162 0ustar pravipraviYou have been invited <%= "by #{@project_member.created_by.name} " if @project_member.created_by %>to join project <%= @project.name_with_namespace %> as <%= @project_member.human_access %>. Accept invitation: <%= invite_url(@token) %> Decline invitation: <%= decline_invite_url(@token) %> ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_merge_request_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_merge_request_email.t0000644000175600017570000000051412672631600031112 0ustar pravipraviNew Merge Request #<%= @merge_request.iid %> <%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)) %> <%= merge_path_description(@merge_request, 'to') %> Author: <%= @merge_request.author_name %> Assignee: <%= @merge_request.assignee_name %> ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_access_granted_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_access_granted_emai0000644000175600017570000000020012672631600031125 0ustar pravipravi%p = "You have been granted #{@group_member.human_access} access to group" = link_to group_url(@group) do = @group.name ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_declined_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_declined_e0000644000175600017570000000024312672631600031137 0ustar pravipravi<%= @invite_email %> has declined your invitation to join project <%= @project.name_with_namespace %>. <%= namespace_project_url(@project.namespace, @project) %> ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_declined_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_declined_e0000644000175600017570000000024612672631600031142 0ustar pravipravi%p #{@invite_email} has declined your invitation to join project #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)}. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/_note_message.html.haml0000644000175600017570000000025612672631600030457 0ustar pravipravi- if current_application_settings.email_author_in_body %div #{link_to @note.author_name, user_url(@note.author)} wrote: %div = markdown(@note.note, pipeline: :email) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merge_request_status_email.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/merge_request_status_emai0000644000175600017570000000054612672631600031233 0ustar pravipravi= "Merge Request ##{@merge_request.iid} was #{@mr_status} by #{@updated_by.name}" Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') Author: #{@merge_request.author_name} Assignee: #{@merge_request.assignee_name} ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/repository_push_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/repository_push_email.htm0000644000175600017570000000407412672631600031202 0ustar pravipravi%h3 #{@message.author_name} #{@message.action_name} #{@message.ref_type} #{@message.ref_name} at #{link_to(@message.project_name_with_namespace, namespace_project_url(@message.project_namespace, @message.project))} - if @message.compare - if @message.reverse_compare? %p %strong WARNING: The push did not contain any new commits, but force pushed to delete the commits and changes below. %h4 = @message.reverse_compare? ? "Deleted commits:" : "Commits:" %ul - @message.commits.each do |commit| %li %strong #{link_to(commit.short_id, namespace_project_commit_url(@message.project_namespace, @message.project, commit))} %div %span by #{commit.author_name} %i at #{commit.committed_date.to_s(:iso8601)} %pre.commit-message = commit.safe_message %h4 #{pluralize @message.diffs_count, "changed file"}: %ul - @message.diffs.each_with_index do |diff, i| %li.file-stats %a{href: "#{@message.target_url if @message.disable_diffs?}#diff-#{i}" } - if diff.deleted_file %span.deleted-file − = diff.old_path - elsif diff.renamed_file = diff.old_path → = diff.new_path - elsif diff.new_file %span.new-file + = diff.new_path - else = diff.new_path - unless @message.disable_diffs? %h4 Changes: - @message.diffs.each_with_index do |diff, i| %li{id: "diff-#{i}"} %a{href: @message.target_url + "#diff-#{i}"} - if diff.deleted_file %strong = diff.old_path deleted - elsif diff.renamed_file %strong = diff.old_path → %strong = diff.new_path - else %strong = diff.new_path %hr = color_email_diff(diff.diff) %br - if @message.compare_timeout %h5 Huge diff. To prevent performance issues changes are hidden gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_issue_email.html.haml0000644000175600017570000000042712672631600031017 0ustar pravipravi- if current_application_settings.email_author_in_body %div #{link_to @issue.author_name, user_url(@issue.author)} wrote: -if @issue.description = markdown(@issue.description, pipeline: :email) - if @issue.assignee_id.present? %p Assignee: #{@issue.assignee_name} ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_accepted_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/project_invite_accepted_e0000644000175600017570000000041312672631600031137 0ustar pravipravi%p #{@project_member.invite_email}, now known as #{link_to @project_member.user.name, user_url(@project_member.user)}, has accepted your invitation to join project #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)}. ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_member_invited_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_member_invited_emai0000644000175600017570000000041212672631600031156 0ustar pravipraviYou have been invited <%= "by #{@group_member.created_by.name} " if @group_member.created_by %>to join group <%= @group.name %> as <%= @group_member.human_access %>. Accept invitation: <%= invite_url(@token) %> Decline invitation: <%= decline_invite_url(@token) %> gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_user_email.text.erb0000644000175600017570000000054312672631600030513 0ustar pravipraviHi <%= @user.name %>! The Administrator created an account for you. Now you are a member of the company GitLab application. login.................. <%= @user.email %> <% if @user.created_by_id %> <%= link_to "Click here to set your password", edit_password_url(@user, :reset_password_token => @token) %> <%= reset_token_expire_message %> <% end %> ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_fail_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/build_fail_email.html.ham0000644000175600017570000000136012672631600030731 0ustar pravipravi- content_for :header do %h1{style: "background: #c40834; color: #FFF; font: normal 20px Helvetica, Arial, sans-serif; margin: 0; padding: 5px 10px; line-height: 32px; font-size: 16px;"} GitLab (build failed) %h3 Project: = link_to namespace_project_url(@project.namespace, @project) do = @project.name %p Commit: #{link_to @build.short_sha, namespace_project_commit_url(@build.project.namespace, @build.project, @build.sha)} %p Author: #{@build.commit.git_author_name} %p Branch: #{@build.ref} %p Stage: #{@build.stage} %p Job: #{@build.name} %p Message: #{@build.commit.git_commit_message} %p Build details: #{link_to "Build #{@build.id}", namespace_project_build_url(@build.project.namespace, @build.project, @build)} ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/_reassigned_issuable_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/_reassigned_issuable_emai0000644000175600017570000000053712672631600031133 0ustar pravipraviReassigned <%= issuable.class.model_name.human.titleize %> <%= issuable.iid %> <%= url_for([issuable.project.namespace.becomes(Namespace), issuable.project, issuable, {only_path: false}]) %> Assignee changed <%= "from #{@previous_assignee.name}" if @previous_assignee -%> to <%= "#{issuable.assignee_id ? issuable.assignee_name : 'Unassigned'}" %> ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_merge_request_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_merge_request_email.0000644000175600017570000000022312672631600031077 0ustar pravipravi- if @note.diff_file_name %p.details New comment on diff for = link_to @note.diff_file_name, @target_url \: = render 'note_message' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/new_issue_email.text.erb0000644000175600017570000000033312672631600030662 0ustar pravipraviNew Issue was created. Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> Author: <%= @issue.author_name %> Assignee: <%= @issue.assignee_name %> ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_commit_email.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/note_commit_email.html.ha0000644000175600017570000000003112672631600030771 0ustar pravipravi= render 'note_message' ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_access_granted_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_access_granted_emai0000644000175600017570000000017712672631600031142 0ustar pravipravi You have been granted <%= @group_member.human_access %> access to group <%= @group.name %> <%= url_for(group_url(@group)) %> ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/repository_push_email.text.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/repository_push_email.tex0000644000175600017570000000266212672631600031213 0ustar pravipravi#{@message.author_name} #{@message.action_name} #{@message.ref_type} #{@message.ref_name} at #{@message.project_name_with_namespace} - if @message.compare \ \ - if @message.reverse_compare? WARNING: The push did not contain any new commits, but force pushed to delete the commits and changes below. \ \ = @message.reverse_compare? ? "Deleted commits:" : "Commits:" - @message.commits.each do |commit| #{commit.short_id} by #{commit.author_name} at #{commit.committed_date.to_s(:iso8601)} #{commit.safe_message} \- - - - - \ \ #{pluralize @message.diffs_count, "changed file"}: \ - @message.diffs.each do |diff| - if diff.deleted_file \- − #{diff.old_path} - elsif diff.renamed_file \- #{diff.old_path} → #{diff.new_path} - elsif diff.new_file \- + #{diff.new_path} - else \- #{diff.new_path} - unless @message.disable_diffs? \ \ Changes: - @message.diffs.each do |diff| \ \===================================== - if diff.deleted_file #{diff.old_path} deleted - elsif diff.renamed_file #{diff.old_path} → #{diff.new_path} - else = diff.new_path \===================================== != diff.diff - if @message.compare_timeout \ \ Huge diff. To prevent performance issues it was hidden - if @message.target_url \ \ View it on GitLab: #{@message.target_url} ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_issue_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/reassigned_issue_email.te0000644000175600017570000000007412672631600031074 0ustar pravipravi<%= render 'reassigned_issuable_email', issuable: @issue %> ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_declined_email.text.erbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/notify/group_invite_declined_ema0000644000175600017570000000015612672631600031146 0ustar pravipravi<%= @invite_email %> has declined your invitation to join group <%= @group.name %>. <%= group_url(@group) %> gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/0000755000175600017570000000000012672631600024226 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_google_analytics.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_google_analytics.html.h0000644000175600017570000000072112672631600031024 0ustar pravipravi:javascript var _gaq = _gaq || []; _gaq.push(['_setAccount', '#{extra_config.google_analytics_id}']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_init_auto_complete.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_init_auto_complete.html0000644000175600017570000000041412672631600031135 0ustar pravipravi- project = @target_project || @project - if @noteable :javascript GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_namespace_project_path(project.namespace, project, type: @noteable.class, type_id: params[:id])}" GitLab.GfmAutoComplete.setup(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/devise.html.haml0000644000175600017570000000214312672631600027313 0ustar pravipravi!!! 5 %html{ lang: "en"} = render "layouts/head" %body.ui_charcoal.login-page.application.navless = render "layouts/header/empty" = render "layouts/broadcast" .container.navless-container .content = render "layouts/flash" .row .col-sm-5.pull-right = yield .col-sm-7.brand-holder.pull-left %h1 = brand_title - if brand_item = brand_image = brand_text - else %h3 Open source software to collaborate on code %p Manage git repositories with fine grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki. - if extra_sign_in_text.present? = markdown(extra_sign_in_text) %hr .container .footer-links = link_to "Explore", explore_root_path = link_to "Help", help_path = link_to "About GitLab", "https://about.gitlab.com/" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_head.html.haml0000644000175600017570000000452612672631600027103 0ustar pravipravi- page_description brand_title unless page_description - site_name = "GitLab" %head{prefix: "og: http://ogp.me/ns#"} %meta{charset: "utf-8"} %meta{'http-equiv' => 'X-UA-Compatible', content: 'IE=edge'} -# Open Graph - http://ogp.me/ %meta{property: 'og:type', content: "object"} %meta{property: 'og:site_name', content: site_name} %meta{property: 'og:title', content: page_title} %meta{property: 'og:description', content: page_description} %meta{property: 'og:image', content: page_image} %meta{property: 'og:url', content: request.base_url + request.fullpath} -# Twitter Card - https://dev.twitter.com/cards/types/summary %meta{property: 'twitter:card', content: "summary"} %meta{property: 'twitter:title', content: page_title} %meta{property: 'twitter:description', content: page_description} %meta{property: 'twitter:image', content: page_image} = page_card_meta_tags %title= page_title(site_name) %meta{name: "description", content: page_description} = favicon_link_tag 'favicon.ico' = stylesheet_link_tag "application", media: "all" = stylesheet_link_tag "print", media: "print" = javascript_include_tag "application" = csrf_meta_tags = include_gon - unless browser.safari? %meta{name: 'referrer', content: 'origin-when-cross-origin'} %meta{name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1'} %meta{name: 'theme-color', content: '#474D57'} -# Apple Safari/iOS home screen icons = favicon_link_tag 'touch-icon-iphone.png', rel: 'apple-touch-icon' = favicon_link_tag 'touch-icon-ipad.png', rel: 'apple-touch-icon', sizes: '76x76' = favicon_link_tag 'touch-icon-iphone-retina.png', rel: 'apple-touch-icon', sizes: '120x120' = favicon_link_tag 'touch-icon-ipad-retina.png', rel: 'apple-touch-icon', sizes: '152x152' -# Windows 8 pinned site tile %meta{name: 'msapplication-TileImage', content: image_path('msapplication-tile.png')} %meta{name: 'msapplication-TileColor', content: '#30353E'} = yield :meta_tags = render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id') = render 'layouts/piwik' if extra_config.has_key?('piwik_url') && extra_config.has_key?('piwik_site_id') = render 'layouts/bootlint' if Rails.env.development? = render 'layouts/user_styles' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_broadcast.html.haml0000644000175600017570000000002412672631600030131 0ustar pravipravi= broadcast_message gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/help.html.haml0000644000175600017570000000014312672631600026762 0ustar pravipravi- page_title "Help" - header_title "Help", help_path = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_page.html.haml0000644000175600017570000000205612672631600027112 0ustar pravipravi.page-with-sidebar{ class: "#{page_sidebar_class} #{page_gutter_class}" } = render "layouts/broadcast" .sidebar-wrapper.nicescroll{ class: nav_sidebar_class } .header-logo %a#logo = brand_header_logo = link_to root_path, class: 'gitlab-text-container-link', title: 'Dashboard', id: 'js-shortcuts-home' do .gitlab-text-container %h3 GitLab - if defined?(sidebar) && sidebar = render "layouts/nav/#{sidebar}" - elsif current_user = render 'layouts/nav/dashboard' - else = render 'layouts/nav/explore' .collapse-nav = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user', title: "Profile" do = image_tag avatar_icon(current_user, 60), alt: 'Profile', class: 'avatar avatar s36' .username = current_user.username .content-wrapper = render "layouts/flash" = yield :flash_message %div{ class: (container_class unless @no_container) } .content .clearfix = yield gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/0000755000175600017570000000000012672631600025012 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_dashboard.html.haml0000644000175600017570000000402412672631600030706 0ustar pravipravi%ul.nav.nav-sidebar = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: {class: 'home'}) do = link_to dashboard_projects_path, title: 'Projects' do = icon('home fw') %span Projects = nav_link(controller: :todos) do = link_to dashboard_todos_path, title: 'Todos' do = icon('bell fw') %span Todos %span.count= number_with_delimiter(todos_pending_count) = nav_link(path: 'dashboard#activity') do = link_to activity_dashboard_path, class: 'shortcuts-activity', title: 'Activity' do = icon('dashboard fw') %span Activity = nav_link(controller: :groups) do = link_to dashboard_groups_path, title: 'Groups' do = icon('group fw') %span Groups = nav_link(controller: :milestones) do = link_to dashboard_milestones_path, title: 'Milestones' do = icon('clock-o fw') %span Milestones = nav_link(path: 'dashboard#issues') do = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues' do = icon('exclamation-circle fw') %span Issues %span.count= number_with_delimiter(current_user.assigned_issues.opened.count) = nav_link(path: 'dashboard#merge_requests') do = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests' do = icon('tasks fw') %span Merge Requests %span.count= number_with_delimiter(current_user.assigned_merge_requests.opened.count) = nav_link(controller: :snippets) do = link_to dashboard_snippets_path, title: 'Snippets' do = icon('clipboard fw') %span Snippets = nav_link(controller: :help) do = link_to help_path, title: 'Help' do = icon('question-circle fw') %span Help %li.separate-item = nav_link(controller: :profile) do = link_to profile_path, title: 'Profile Settings', data: {placement: 'bottom'} do = icon('user fw') %span Profile Settings gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_profile.html.haml0000644000175600017570000000370412672631600030423 0ustar pravipravi%ul.nav.nav-sidebar = nav_link do = link_to root_path, title: 'Go to dashboard', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to dashboard %li.separate-item = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do = link_to profile_path, title: 'Profile Settings' do = icon('user fw') %span Profile Settings = nav_link(controller: [:accounts, :two_factor_auths]) do = link_to profile_account_path, title: 'Account' do = icon('gear fw') %span Account = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new', 'applications#create']) do = link_to applications_profile_path, title: 'Applications' do = icon('cloud fw') %span Applications = nav_link(controller: :emails) do = link_to profile_emails_path, title: 'Emails' do = icon('envelope-o fw') %span Emails %span.count= number_with_delimiter(current_user.emails.count + 1) - unless current_user.ldap_user? = nav_link(controller: :passwords) do = link_to edit_profile_password_path, title: 'Password' do = icon('lock fw') %span Password = nav_link(controller: :notifications) do = link_to profile_notifications_path, title: 'Notifications' do = icon('inbox fw') %span Notifications = nav_link(controller: :keys) do = link_to profile_keys_path, title: 'SSH Keys' do = icon('key fw') %span SSH Keys %span.count= number_with_delimiter(current_user.keys.count) = nav_link(controller: :preferences) do = link_to profile_preferences_path, title: 'Preferences' do -# TODO (rspeicher): Better icon? = icon('image fw') %span Preferences = nav_link(path: 'profiles#audit_log') do = link_to audit_log_profile_path, title: 'Audit Log' do = icon('history fw') %span Audit Log gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_project.html.haml0000644000175600017570000001124712672631600030432 0ustar pravipravi%ul.nav.nav-sidebar - if @project.group = nav_link do = link_to group_path(@project.group), title: 'Go to group', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to group - else = nav_link do = link_to root_path, title: 'Go to dashboard', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to dashboard %li.separate-item = nav_link(path: 'projects#show', html_options: {class: 'home'}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do = icon('home fw') %span Project = nav_link(path: 'projects#activity') do = link_to activity_project_path(@project), title: 'Activity', class: 'shortcuts-project-activity' do = icon('dashboard fw') %span Activity - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree find_file)) do = link_to project_files_path(@project), title: 'Files', class: 'shortcuts-tree' do = icon('files-o fw') %span Files - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches releases network)) do = link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits' do = icon('history fw') %span Commits - if project_nav_tab? :builds = nav_link(controller: %w(builds)) do = link_to project_builds_path(@project), title: 'Builds', class: 'shortcuts-builds' do = icon('cubes fw') %span Builds %span.count.builds_counter= number_with_delimiter(@project.builds.running_or_pending.count(:all)) - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do = link_to namespace_project_graph_path(@project.namespace, @project, current_ref), title: 'Graphs', class: 'shortcuts-graphs' do = icon('area-chart fw') %span Graphs - if project_nav_tab? :milestones = nav_link(controller: :milestones) do = link_to namespace_project_milestones_path(@project.namespace, @project), title: 'Milestones' do = icon('clock-o fw') %span Milestones - if project_nav_tab? :issues = nav_link(controller: :issues) do = link_to url_for_project_issues(@project, only_path: true), title: 'Issues', class: 'shortcuts-issues' do = icon('exclamation-circle fw') %span Issues - if @project.default_issues_tracker? %span.count.issue_counter= number_with_delimiter(@project.issues.opened.count) - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do = link_to namespace_project_merge_requests_path(@project.namespace, @project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do = icon('tasks fw') %span Merge Requests %span.count.merge_counter= number_with_delimiter(@project.merge_requests.opened.count) - if project_nav_tab? :settings = nav_link(controller: [:project_members, :teams]) do = link_to namespace_project_project_members_path(@project.namespace, @project), title: 'Members', class: 'team-tab tab' do = icon('users fw') %span Members - if project_nav_tab? :labels = nav_link(controller: :labels) do = link_to namespace_project_labels_path(@project.namespace, @project), title: 'Labels' do = icon('tags fw') %span Labels - if project_nav_tab? :wiki = nav_link(controller: :wikis) do = link_to get_project_wiki_path(@project), title: 'Wiki', class: 'shortcuts-wiki' do = icon('book fw') %span Wiki - if project_nav_tab? :forks = nav_link(controller: :forks, action: :index) do = link_to namespace_project_forks_path(@project.namespace, @project), title: 'Forks' do = icon('code-fork fw') %span Forks - if project_nav_tab? :snippets = nav_link(controller: :snippets) do = link_to namespace_project_snippets_path(@project.namespace, @project), title: 'Snippets', class: 'shortcuts-snippets' do = icon('clipboard fw') %span Snippets - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do = link_to edit_project_path(@project), title: 'Settings' do = icon('cogs fw') %span Settings -# Global shortcut to network page for compatibility - if project_nav_tab? :network %li.hidden = link_to namespace_project_network_path(@project.namespace, @project, current_ref), title: 'Network', class: 'shortcuts-network' do Network gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_explore.html.haml0000644000175600017570000000130312672631600030432 0ustar pravipravi%ul.nav.nav-sidebar = nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do = link_to explore_root_path, title: 'Projects' do = icon('home fw') %span Projects = nav_link(controller: :groups) do = link_to explore_groups_path, title: 'Groups' do = icon('group fw') %span Groups = nav_link(controller: :snippets) do = link_to explore_snippets_path, title: 'Snippets' do = icon('clipboard fw') %span Snippets = nav_link(controller: :help) do = link_to help_path, title: 'Help' do = icon('question-circle fw') %span Help ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_group_settings.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_group_settings.html0000644000175600017570000000110612672631600031111 0ustar pravipravi%ul.nav.nav-sidebar = nav_link do = link_to group_path(@group), title: 'Go to group', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to group %li.separate-item %ul.sidebar-subnav = nav_link(path: 'groups#edit') do = link_to edit_group_path(@group), title: 'Group Settings' do = icon ('pencil-square-o fw') %span Group Settings = nav_link(path: 'groups#projects') do = link_to projects_group_path(@group), title: 'Projects' do = icon('folder fw') %span Projects ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_project_settings.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_project_settings.ht0000644000175600017570000000362712672631600031104 0ustar pravipravi%ul.nav.nav-sidebar = nav_link do = link_to project_path(@project), title: 'Go to project', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to project %li.separate-item %ul.sidebar-subnav = nav_link(path: 'projects#edit') do = link_to edit_project_path(@project), title: 'Project Settings' do = icon('pencil-square-o fw') %span Project Settings = nav_link(controller: :deploy_keys) do = link_to namespace_project_deploy_keys_path(@project.namespace, @project), title: 'Deploy Keys' do = icon('key fw') %span Deploy Keys = nav_link(controller: :hooks) do = link_to namespace_project_hooks_path(@project.namespace, @project), title: 'Web Hooks' do = icon('link fw') %span Web Hooks = nav_link(controller: :services) do = link_to namespace_project_services_path(@project.namespace, @project), title: 'Services' do = icon('cogs fw') %span Services = nav_link(controller: :protected_branches) do = link_to namespace_project_protected_branches_path(@project.namespace, @project), title: 'Protected Branches' do = icon('lock fw') %span Protected Branches - if @project.builds_enabled? = nav_link(controller: :runners) do = link_to namespace_project_runners_path(@project.namespace, @project), title: 'Runners' do = icon('cog fw') %span Runners = nav_link(controller: :variables) do = link_to namespace_project_variables_path(@project.namespace, @project), title: 'Variables' do = icon('code fw') %span Variables = nav_link path: 'triggers#index' do = link_to namespace_project_triggers_path(@project.namespace, @project), title: 'Triggers' do = icon('retweet fw') %span Triggers gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_admin.html.haml0000644000175600017570000000626712672631600030062 0ustar pravipravi%ul.nav.nav-sidebar = nav_link(controller: :dashboard, html_options: {class: 'home'}) do = link_to admin_root_path, title: 'Overview' do = icon('dashboard fw') %span Overview = nav_link(controller: [:admin, :projects]) do = link_to admin_namespaces_projects_path, title: 'Projects' do = icon('cube fw') %span Projects = nav_link(controller: :users) do = link_to admin_users_path, title: 'Users' do = icon('user fw') %span Users = nav_link(controller: :groups) do = link_to admin_groups_path, title: 'Groups' do = icon('group fw') %span Groups = nav_link(controller: :deploy_keys) do = link_to admin_deploy_keys_path, title: 'Deploy Keys' do = icon('key fw') %span Deploy Keys = nav_link path: ['runners#index', 'runners#show'] do = link_to admin_runners_path, title: 'Runners' do = icon('cog fw') %span Runners %span.count= number_with_delimiter(Ci::Runner.count(:all)) = nav_link path: 'builds#index' do = link_to admin_builds_path, title: 'Builds' do = icon('link fw') %span Builds %span.count= number_with_delimiter(Ci::Build.count(:all)) = nav_link(controller: :logs) do = link_to admin_logs_path, title: 'Logs' do = icon('file-text fw') %span Logs = nav_link(controller: :broadcast_messages) do = link_to admin_broadcast_messages_path, title: 'Messages' do = icon('bullhorn fw') %span Messages = nav_link(controller: :hooks) do = link_to admin_hooks_path, title: 'Hooks' do = icon('external-link fw') %span Hooks = nav_link(controller: :background_jobs) do = link_to admin_background_jobs_path, title: 'Background Jobs' do = icon('cog fw') %span Background Jobs = nav_link(controller: :appearances) do = link_to admin_appearances_path, title: 'Appearances' do = icon('image') %span Appearance = nav_link(controller: :applications) do = link_to admin_applications_path, title: 'Applications' do = icon('cloud fw') %span Applications = nav_link(controller: :services) do = link_to admin_application_settings_services_path, title: 'Service Templates' do = icon('copy fw') %span Service Templates = nav_link(controller: :labels) do = link_to admin_labels_path, title: 'Labels' do = icon('tags fw') %span Labels = nav_link(controller: :abuse_reports) do = link_to admin_abuse_reports_path, title: "Abuse Reports" do = icon('exclamation-circle fw') %span Abuse Reports %span.count= number_with_delimiter(AbuseReport.count(:all)) - if askimet_enabled? = nav_link(controller: :spam_logs) do = link_to admin_spam_logs_path, title: "Spam Logs" do = icon('exclamation-triangle fw') %span Spam Logs %span.count= number_with_delimiter(SpamLog.count(:all)) = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do = link_to admin_application_settings_path, title: 'Settings' do = icon('cogs fw') %span Settings gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/nav/_group.html.haml0000644000175600017570000000317712672631600030123 0ustar pravipravi%ul.nav.nav-sidebar = nav_link do = link_to root_path, title: 'Go to dashboard', class: 'back-link' do = icon('caret-square-o-left fw') %span Go to dashboard %li.separate-item = nav_link(path: 'groups#show', html_options: {class: 'home'}) do = link_to group_path(@group), title: 'Home' do = icon('dashboard fw') %span Group - if can?(current_user, :read_group, @group) - if current_user = nav_link(controller: [:group, :milestones]) do = link_to group_milestones_path(@group), title: 'Milestones' do = icon('clock-o fw') %span Milestones = nav_link(path: 'groups#issues') do = link_to issues_group_path(@group), title: 'Issues' do = icon('exclamation-circle fw') %span Issues - if current_user %span.count= number_with_delimiter(Issue.opened.of_group(@group).count) = nav_link(path: 'groups#merge_requests') do = link_to merge_requests_group_path(@group), title: 'Merge Requests' do = icon('tasks fw') %span Merge Requests - if current_user %span.count= number_with_delimiter(MergeRequest.opened.of_group(@group).count) = nav_link(controller: [:group_members]) do = link_to group_group_members_path(@group), title: 'Members' do = icon('users fw') %span Members - if can?(current_user, :admin_group, @group) = nav_link(html_options: { class: "separate-item" }) do = link_to edit_group_path(@group), title: 'Settings' do = icon ('cogs fw') %span Settings gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/notify.html.haml0000644000175600017570000000266012672631600027350 0ustar pravipravi%html{lang: "en"} %head %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"} %title GitLab :css img { max-width: 100%; height: auto; } p.details { font-style:italic; color:#777 } .footer p { font-size:small; color:#777 } pre.commit-message { white-space: pre-wrap; } .file-stats a { text-decoration: none; } .file-stats .new-file { color: #090; } .file-stats .deleted-file { color: #B00; } %body %div.content = yield %div.footer{style: "margin-top: 10px;"} %p — %br - if @target_url - if @reply_by_email Reply to this email directly or #{link_to "view it on GitLab", @target_url}. - else #{link_to "View it on GitLab", @target_url}. %br -# Don't link the host is the line below, one link in the email is easier to quickly click than two. You're receiving this email because of your account on #{Gitlab.config.gitlab.host}. If you'd like to receive fewer emails, you can - if @sent_notification && @sent_notification.unsubscribable? = link_to "unsubscribe", unsubscribe_sent_notification_url(@sent_notification) from this thread or adjust your notification settings. = email_action @target_url gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/project.html.haml0000644000175600017570000000126212672631600027503 0ustar pravipravi- page_title @project.name_with_namespace - page_description @project.description unless page_description - header_title project_title(@project) unless header_title - sidebar "project" unless sidebar - content_for :scripts_body_top do - project = @target_project || @project - if current_user :javascript window.project_uploads_path = "#{namespace_project_uploads_path project.namespace,project}"; window.markdown_preview_path = "#{markdown_preview_namespace_project_path(project.namespace, project)}"; - content_for :scripts_body do = render "layouts/init_auto_complete" if current_user = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_search.html.haml0000644000175600017570000000235112672631600027441 0ustar pravipravi.search = form_tag search_path, method: :get, class: 'navbar-form pull-left' do |f| = search_field_tag "search", nil, placeholder: 'Search', class: "search-input form-control", spellcheck: false = hidden_field_tag :group_id, @group.try(:id) - if @project && @project.persisted? = hidden_field_tag :project_id, @project.id - if current_controller?(:issues) = hidden_field_tag :scope, 'issues' - elsif current_controller?(:merge_requests) = hidden_field_tag :scope, 'merge_requests' - elsif current_controller?(:wikis) = hidden_field_tag :scope, 'wiki_blobs' - elsif current_controller?(:commits) = hidden_field_tag :scope, 'commits' - else = hidden_field_tag :search_code, true - if @snippet || @snippets = hidden_field_tag :snippets, true = hidden_field_tag :repository_ref, @ref = button_tag 'Go' if ENV['RAILS_ENV'] == 'test' .search-autocomplete-opts.hide{:'data-autocomplete-path' => search_autocomplete_path, :'data-autocomplete-project-id' => @project.try(:id), :'data-autocomplete-project-ref' => @ref } :javascript $('.search-input').on('keyup', function(e) { if (e.keyCode == 27) { $('.search-input').blur(); } }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/errors.html.haml0000644000175600017570000000037112672631600027351 0ustar pravipravi!!! 5 %html{ lang: "en"} = render "layouts/head" %body{class: "#{user_application_theme} application navless"} = render "layouts/header/empty" .container.navless-container = render "layouts/flash" .error-page = yield gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/snippets.html.haml0000644000175600017570000000012412672631600027676 0ustar pravipravi- header_title "Snippets", snippets_path = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_user_styles.html.haml0000644000175600017570000000073112672631600030555 0ustar pravipravi:css [data-user-is] { display: none !important; } [data-user-is="#{current_user.try(:id)}"] { display: block !important; } [data-user-is="#{current_user.try(:id)}"][data-display="inline"] { display: inline !important; } [data-user-is-not] { display: block !important; } [data-user-is-not][data-display="inline"] { display: inline !important; } [data-user-is-not="#{current_user.try(:id)}"] { display: none !important; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/admin.html.haml0000644000175600017570000000021512672631600027122 0ustar pravipravi- page_title "Admin Area" - header_title "Admin Area", admin_root_path - sidebar "admin" = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/ci/0000755000175600017570000000000012672631600024621 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/ci/_page.html.haml0000644000175600017570000000171712672631600027510 0ustar pravipravi.page-with-sidebar{ class: page_sidebar_class } = render "layouts/broadcast" .sidebar-wrapper.nicescroll{ class: nav_sidebar_class } .header-logo %a#logo = brand_header_logo = link_to root_path, class: 'gitlab-text-container-link', title: 'Dashboard', id: 'js-shortcuts-home' do .gitlab-text-container %h3 GitLab - if defined?(sidebar) && sidebar = render "layouts/ci/#{sidebar}" - elsif current_user = render 'layouts/nav/dashboard' .collapse-nav = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user', title: "Profile" do = image_tag avatar_icon(current_user, 60), alt: 'Profile', class: 'avatar avatar s36' .username = current_user.username .content-wrapper = render "layouts/flash" = render 'layouts/ci/info' %div{ class: container_class } .content .clearfix = yield gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/ci/notify.html.haml0000644000175600017570000000123112672631600027734 0ustar pravipravi%html{lang: "en"} %head %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"} %title GitLab CI %body = yield :header %table{align: "left", border: "0", cellpadding: "0", cellspacing: "0", style: "padding: 10px 0;", width: "100%"} %tr %td{align: "left", style: "margin: 0; padding: 10px;"} = yield %br %tr %td{align: "left", style: "margin: 0; padding: 10px;"} %p{style: "font-size:small;color:#777"} - if @project You're receiving this notification because you are the one who triggered a build on the #{@project.name} project. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/ci/_info.html.haml0000644000175600017570000000015012672631600027515 0ustar pravipravi- if current_user && current_user.is_admin? && Ci::Runner.count.zero? = render 'ci/shared/no_runners' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/application.html.haml0000644000175600017570000000075312672631600030344 0ustar pravipravi!!! 5 %html{ lang: "en"} = render "layouts/head" %body{class: "#{user_application_theme}", 'data-page' => body_data_page} -# Ideally this would be inside the head, but turbolinks only evaluates page-specific JS in the body. = yield :scripts_body_top - if current_user = render "layouts/header/default", title: header_title - else = render "layouts/header/public", title: header_title = render 'layouts/page', sidebar: sidebar = yield :scripts_body gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/explore.html.haml0000644000175600017570000000022012672631600027504 0ustar pravipravi- page_title "Explore" - unless current_user - header_title "Explore GitLab", explore_root_path = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/profile.html.haml0000644000175600017570000000025412672631600027475 0ustar pravipravi- page_title "Profile Settings" - header_title "Profile Settings", profile_path unless header_title - sidebar "profile" = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/dashboard.html.haml0000644000175600017570000000023512672631600027763 0ustar pravipravi- page_title "Dashboard" - header_title "Dashboard", root_path unless header_title - sidebar "dashboard" = render template: "layouts/application" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_flash.html.haml0000644000175600017570000000016012672631600027265 0ustar pravipravi.flash-container - if alert .flash-alert = alert - elsif notice .flash-notice = notice gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/search.html.haml0000644000175600017570000000015112672631600027276 0ustar pravipravi- page_title "Search" - header_title "Search", search_path = render template: "layouts/application" ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_collapse_button.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_collapse_button.html.ha0000644000175600017570000000031712672631600031040 0ustar pravipravi- if nav_menu_collapsed? = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse', title: "Open/Close" - else = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse', title: "Open/Close" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/group_settings.html.haml0000644000175600017570000000025012672631600031105 0ustar pravipravi- page_title "Settings" - header_title group_title(@group, "Settings", edit_group_path(@group)) - sidebar "group_settings" = render template: "layouts/group" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/header/0000755000175600017570000000000012672631600025456 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/header/_public.html.haml0000644000175600017570000000063312672631600030703 0ustar pravipravi%header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content - unless current_controller?('sessions') .pull-right = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success' %h1.title= title = render 'shared/outdated_browser' ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/header/_default.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/header/_default.html.ham0000644000175600017570000000444512672631600030702 0ustar pravipravi%header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content %button.navbar-toggle{type: 'button'} %span.sr-only Toggle navigation = icon('bars') .navbar-collapse.collapse %ul.nav.navbar-nav.pull-right - unless @disable_search_panel %li.hidden-sm.hidden-xs = render 'layouts/search' %li.visible-sm.visible-xs = link_to search_path, title: 'Search', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('search') - if session[:impersonator_id] %li.impersonation = link_to stop_impersonation_admin_users_path, method: :delete, title: 'Stop Impersonation', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do = icon('user-secret fw') - if current_user.is_admin? %li = link_to admin_root_path, title: 'Admin Area', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('wrench fw') %li = link_to dashboard_todos_path, title: 'Todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do %span.badge.todos-pending-count = todos_pending_count - if current_user.can_create_project? %li = link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('plus fw') - if Gitlab::Sherlock.enabled? %li = link_to sherlock_transactions_path, title: 'Sherlock Transactions', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('tachometer fw') %li = link_to destroy_user_session_path, class: 'logout', method: :delete, title: 'Sign out', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('sign-out') %h1.title= title = render 'shared/outdated_browser' - if @project && !@project.empty_repo? :javascript var findFileURL = "#{namespace_project_find_file_path(@project.namespace, @project, @ref || @project.repository.root_ref)}"; gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/header/_empty.html.haml0000644000175600017570000000014512672631600030561 0ustar pravipravi%header.navbar.navbar-fixed-top.navbar-empty .container .center-logo = brand_header_logo gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/group.html.haml0000644000175600017570000000037112672631600027171 0ustar pravipravi- page_title @group.name - page_description @group.description unless page_description - header_title group_title(@group) unless header_title - sidebar "group" unless sidebar = render template: "layouts/application" ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/project_settings.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/project_settings.html.ha0000644000175600017570000000026012672631600031067 0ustar pravipravi- page_title "Settings" - header_title project_title(@project, "Settings", edit_project_path(@project)) - sidebar "project_settings" = render template: "layouts/project" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_page_title.html.haml0000644000175600017570000000006512672631600030311 0ustar pravipravi- if content_for?(:page-title) = yield :page-title gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_bootlint.haml0000644000175600017570000000052212672631600027061 0ustar pravipravi:javascript jQuery(document).ready(function() { javascript:(function(){var s=document.createElement("script");s.onload=function(){bootlint.showLintReportForCurrentDocument([], {hasProblems: false, problemFree: false});};s.src="https://maxcdn.bootstrapcdn.com/bootlint/latest/bootlint.min.js";document.body.appendChild(s)})(); }); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/layouts/_piwik.html.haml0000644000175600017570000000122512672631600027316 0ustar pravipravi :javascript var _paq = _paq || []; _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//#{extra_config.piwik_url}/"; _paq.push(['setTrackerUrl', u+'piwik.php']); _paq.push(['setSiteId', #{extra_config.piwik_site_id}]); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); })(); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/0000755000175600017570000000000012672631600024032 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_note.atom.haml0000644000175600017570000000015412672631600030141 0ustar pravipravi%div{xmlns: "http://www.w3.org/1999/xhtml"} = markdown(note.note, pipeline: :atom, project: note.project) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_events.html.haml0000644000175600017570000000006612672631600027305 0ustar pravipravi= render partial: 'events/event', collection: @events ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_merge_request.atom.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_merge_request.atom0000644000175600017570000000020512672631600031120 0ustar pravipravi%div{xmlns: "http://www.w3.org/1999/xhtml"} = markdown(merge_request.description, pipeline: :atom, project: merge_request.project) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_commit.html.haml0000644000175600017570000000043512672631600027271 0ustar pravipravi%li.commit .commit-row-title = link_to truncate_sha(commit[:id]), namespace_project_commit_path(project.namespace, project, commit[:id]), class: "commit_short_id", alt: '' · = markdown event_commit_title(commit[:message]), project: project, pipeline: :single_line gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event.html.haml0000644000175600017570000000117112672631600027120 0ustar pravipravi- if event.proper? .event-item{class: "#{event.body? ? "event-block" : "event-inline" }"} .event-item-timestamp #{time_ago_with_tooltip(event.created_at)} = cache [event, current_application_settings, "v2.2"] do = image_tag avatar_icon(event.author_email, 40), class: "avatar s40", alt:'' - if event.created_project? = render "events/event/created_project", event: event - elsif event.push? = render "events/event/push", event: event - elsif event.commented? = render "events/event/note", event: event - else = render "events/event/common", event: event gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/0000755000175600017570000000000012672631600025153 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/_note.html.haml0000644000175600017570000000131312672631600030063 0ustar pravipravi.event-title %span.author_name= link_to_author event %span.event_label = event.action_name = event_note_title_html(event) at - if event.project = link_to_project event.project - else = event.project_name .event-body .event-note .md = event_note(event.target.note, project: event.project) - note = event.target - if note.attachment.url - if note.attachment.image? = link_to note.attachment.url, target: '_blank' do = image_tag note.attachment.url, class: 'note-image-attach' - else = link_to note.attachment.url, target: "_blank", class: 'note-file-attach' do %i.fa.fa-paperclip = note.attachment_identifier gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/_push.html.haml0000644000175600017570000000336212672631600030103 0ustar pravipravi.event-title %span.author_name= link_to_author event %span.event_label.pushed #{event.action_name} #{event.ref_type} - if event.rm_ref? %strong= event.ref_name - else %strong = link_to event.ref_name, namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) at = link_to_project event.project - if event.push_with_commits? - project = event.project .event-body %ul.well-list.event_commits - few_commits = event.commits[0...2] - few_commits.each do |commit| = render "events/commit", commit: commit, project: project - create_mr = event.new_ref? && create_mr_button?(event.project.default_branch, event.ref_name, event.project) - if event.commits_count > 1 %li.commits-stat - if event.commits_count > 2 %span ... and #{event.commits_count - 2} more commits. - if event.md_ref? - from = event.commit_from - from_label = truncate_sha(from) - else - from = event.project.default_branch - from_label = from = link_to namespace_project_compare_path(event.project.namespace, event.project, from: from, to: event.commit_to) do Compare #{from_label}...#{truncate_sha(event.commit_to)} - if create_mr %span{"data-user-is" => event.author_id, "data-display" => "inline"} or = link_to create_mr_path(event.project.default_branch, event.ref_name, event.project) do create a merge request - elsif create_mr %li.commits-stat{"data-user-is" => event.author_id} = link_to create_mr_path(event.project.default_branch, event.ref_name, event.project) do Create Merge Request ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/_created_project.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/_created_project.ht0000644000175600017570000000166412672631600031013 0ustar pravipravi.event-title %span.author_name= link_to_author event %span.event_label{class: event.action_name} = event_action_name(event) - if event.project = link_to_project event.project - else = event.project_name - if !event.project.private? && twitter_sharing_enabled? .event-body{"data-user-is" => event.author_id} .event-note .md %p Congratulations! Why not share your accomplishment with the world? %a.twitter-share-button{ | href: "https://twitter.com/share", | "data-url" => event.project.web_url, | "data-text" => "I just #{event.action_name} a new project on GitLab! GitLab is version control on your server.", | "data-size" => "medium", | "data-related" => "gitlab", | "data-hashtags" => "gitlab", | "data-count" => "none"} Tweet %script{src: "//platform.twitter.com/widgets.js"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/event/_common.html.haml0000644000175600017570000000075212672631600030414 0ustar pravipravi.event-title %span.author_name= link_to_author event %span.event_label{class: event.action_name} = event_action_name(event) - if event.target %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] = event_preposition(event) - if event.project = link_to_project event.project - else = event.project_name - if event.target.respond_to?(:title) .event-body .event-note = event.target.title ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_last_push.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_last_push.html.ham0000644000175600017570000000111012672631600031017 0ustar pravipravi- if show_last_push_widget?(event) .gray-content-block.clear-block.last-push-widget .event-last-push .event-last-push-text %span You pushed to = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do %strong= event.ref_name %span at %strong= link_to_project event.project #{time_ago_with_tooltip(event.created_at)} .pull-right = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do Create Merge Request gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_push.atom.haml0000644000175600017570000000106612672631600030156 0ustar pravipravi%div{xmlns: "http://www.w3.org/1999/xhtml"} - event.commits.first(15).each do |commit| %p %strong= commit[:author][:name] = link_to "(##{truncate_sha(commit[:id])})", namespace_project_commit_path(event.project.namespace, event.project, id: commit[:id]) %i at = commit[:timestamp].to_time.to_s(:short) %blockquote= markdown(escape_once(commit[:message]), pipeline: :atom, project: event.project) - if event.commits_count > 15 %p %i \... and = pluralize(event.commits_count - 15, "more commit") gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/events/_event_issue.atom.haml0000644000175600017570000000016512672631600030326 0ustar pravipravi%div{xmlns: "http://www.w3.org/1999/xhtml"} = markdown(issue.description, pipeline: :atom, project: issue.project) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/0000755000175600017570000000000012672631600024373 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/edit.html.haml0000644000175600017570000000027412672631600027131 0ustar pravipravi- page_title "Edit", @snippet.title, "Snippets" %h3.page-title Edit Snippet %hr = render 'shared/snippets/form', url: snippet_path(@snippet), visibility_level: @snippet.visibility_level gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/_actions.html.haml0000644000175600017570000000105212672631600027776 0ustar pravipravi= link_to new_snippet_path, class: 'btn btn-grouped new-snippet-link', title: "New Snippet" do = icon('plus') New Snippet - if can?(current_user, :update_personal_snippet, @snippet) = link_to edit_snippet_path(@snippet), class: "btn btn-grouped snippable-edit" do = icon('pencil-square-o') Edit - if can?(current_user, :admin_personal_snippet, @snippet) = link_to snippet_path(@snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-grouped btn-remove", title: 'Delete Snippet' do = icon('trash-o') Delete gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/new.html.haml0000644000175600017570000000025012672631600026767 0ustar pravipravi- page_title "New Snippet" %h3.page-title New Snippet %hr = render "shared/snippets/form", url: snippets_path(@snippet), visibility_level: default_snippet_visibility gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/index.html.haml0000644000175600017570000000036712672631600027316 0ustar pravipravi- page_title "By #{@user.name}", "Snippets" %ol.breadcrumb %li = link_to snippets_path do Snippets %li = @user.name .pull-right.hidden-xs = link_to user_path(@user) do #{@user.name} profile page = render 'snippets' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/show.html.haml0000644000175600017570000000072212672631600027162 0ustar pravipravi- page_title @snippet.title, "Snippets" .snippet-holder = render 'shared/snippets/header' %article.file-holder .file-title = blob_icon 0, @snippet.file_name %strong = @snippet.file_name .file-actions.hidden-xs = clipboard_button(clipboard_target: ".blob-content[data-blob-id='#{@snippet.id}']") = link_to 'Raw', raw_snippet_path(@snippet), class: "btn btn-sm", target: "_blank" = render 'shared/snippets/blob' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/snippets/_snippets.html.haml0000644000175600017570000000030612672631600030204 0ustar pravipravi%ul.bordered-list = render partial: 'shared/snippets/snippet', collection: @snippets - if @snippets.empty? %li .nothing-here-block Nothing here. = paginate @snippets, theme: 'gitlab' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/0000755000175600017570000000000012672631600024204 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/_head.html.haml0000644000175600017570000000020412672631600027046 0ustar pravipravi.explore-title %h3 Explore GitLab %p.lead Discover projects, groups and snippets. Share your projects with others %br gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/groups/0000755000175600017570000000000012672631600025523 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/groups/index.html.haml0000644000175600017570000000303712672631600030443 0ustar pravipravi- page_title "Groups" - header_title "Groups", dashboard_groups_path - if current_user = render 'dashboard/groups_head' - else = render 'explore/head' .gray-content-block.clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| = hidden_field_tag :sort, @sort .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input", id: "groups_search", spellcheck: false .form-group = button_tag 'Search', class: "btn btn-default" .pull-right .dropdown.inline %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_created %b.caret %ul.dropdown-menu %li = link_to explore_groups_path(sort: sort_value_recently_created) do = sort_title_recently_created = link_to explore_groups_path(sort: sort_value_oldest_created) do = sort_title_oldest_created = link_to explore_groups_path(sort: sort_value_recently_updated) do = sort_title_recently_updated = link_to explore_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %ul.content-list - @groups.each do |group| = render 'shared/groups/group', group: group - unless @groups.present? .nothing-here-block No public groups = paginate @groups, theme: "gitlab" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/0000755000175600017570000000000012672631600026035 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/index.html.haml0000644000175600017570000000047612672631600030761 0ustar pravipravi- page_title "Projects" - header_title "Projects", dashboard_projects_path - if current_user = render 'dashboard/projects_head' - else = render 'explore/head' .top-area = render 'explore/projects/nav' .gray-content-block.second-block.clearfix = render 'filter' = render 'projects', projects: @projects gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_nav.html.haml0000644000175600017570000000055312672631600030571 0ustar pravipravi%ul.nav-links = nav_link(page: [trending_explore_projects_path, explore_root_path]) do = link_to trending_explore_projects_path do Trending = nav_link(page: starred_explore_projects_path) do = link_to starred_explore_projects_path do Most stars = nav_link(page: explore_projects_path) do = link_to explore_projects_path do All ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_projects.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_projects.html.0000644000175600017570000000022512672631600030770 0ustar pravipravi- if projects.any? .projects-list-holder = render 'shared/projects/list', projects: projects - else .nothing-here-block No such projects ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/trending.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/trending.html.h0000644000175600017570000000036212672631600030764 0ustar pravipravi- page_title "Projects" - header_title "Projects", dashboard_projects_path - if current_user = render 'dashboard/projects_head' - else = render 'explore/head' = render 'explore/projects/nav' = render 'projects', projects: @projects ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_dropdown.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_dropdown.html.0000644000175600017570000000147212672631600031000 0ustar pravipravi.dropdown.inline %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %span.light - if @sort.present? = sort_options_hash[@sort] - else = sort_title_recently_updated %b.caret %ul.dropdown-menu %li = link_to explore_projects_filter_path(sort: sort_value_name) do = sort_title_name = link_to explore_projects_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created = link_to explore_projects_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created = link_to explore_projects_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated = link_to explore_projects_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_filter.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/_filter.html.ha0000644000175600017570000000263412672631600030743 0ustar pravipravi.pull-right.hidden-sm.hidden-xs - if current_user .dropdown.inline.append-right-10 %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-globe %span.light Visibility: - if params[:visibility_level].present? = visibility_level_label(params[:visibility_level].to_i) - else Any %b.caret %ul.dropdown-menu %li = link_to explore_projects_filter_path(visibility_level: nil) do Any - Gitlab::VisibilityLevel.values.each do |level| %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } = link_to explore_projects_filter_path(visibility_level: level) do = visibility_level_icon(level) = visibility_level_label(level) - if @tags.present? .dropdown.inline.append-right-10 %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-tags %span.light Tags: - if params[:tag].present? = params[:tag] - else Any %b.caret %ul.dropdown-menu %li = link_to explore_projects_filter_path(tag: nil) do Any - @tags.each do |tag| %li{ class: (tag.name == params[:tag]) ? 'active' : 'light' } = link_to explore_projects_filter_path(tag: tag.name) do %i.fa.fa-tag = tag.name ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/starred.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/projects/starred.html.ha0000644000175600017570000000036212672631600030757 0ustar pravipravi- page_title "Projects" - header_title "Projects", dashboard_projects_path - if current_user = render 'dashboard/projects_head' - else = render 'explore/head' = render 'explore/projects/nav' = render 'projects', projects: @projects gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/snippets/0000755000175600017570000000000012672631600026051 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/explore/snippets/index.html.haml0000644000175600017570000000067712672631600031000 0ustar pravipravi- page_title "Snippets" - header_title "Snippets", snippets_path - if current_user = render 'dashboard/snippets_head' - else = render 'explore/head' .gray-content-block - if current_user .pull-right = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do = icon('plus') New Snippet .oneline Public snippets created by you and other users are listed here = render 'snippets/snippets' gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/0000755000175600017570000000000012672631600024665 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/0000755000175600017570000000000012672631600027353 5ustar pravipravi././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/edit.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/edit.htm0000644000175600017570000000020212672631600031004 0ustar pravipravi- page_title "Edit", @application.name, "Applications" %h3.page-title Edit application = render 'form', application: @application ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/new.html0000644000175600017570000000015712672631600031035 0ustar pravipravi- page_title "New Application" %h3.page-title New Application %hr = render 'form', application: @application././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/_delete_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/_delete_0000644000175600017570000000041012672631600031031 0ustar pravipravi- submit_btn_css ||= 'btn btn-link btn-remove btn-sm' = form_tag oauth_application_path(application) do %input{:name => "_method", :type => "hidden", :value => "delete"}/ = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/index.ht0000644000175600017570000000122112672631600031013 0ustar pravipravi- page_title "Applications" %h3.page-title Your applications %p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' .table-holder %table.table.table-striped %thead %tr %th Name %th Callback URL %th %th %tbody - @applications.each do |application| %tr{:id => "application_#{application.id}"} %td= link_to application.name, oauth_application_path(application) %td= application.redirect_uri %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link' %td= render 'delete_form', application: application ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/_form.ht0000644000175600017570000000164712672631600031022 0ustar pravipravi= form_for application, url: doorkeeper_submit_path(application), html: {class: 'form-horizontal', role: 'form'} do |f| - if application.errors.any? .alert.alert-danger %ul - application.errors.full_messages.each do |msg| %li= msg .form-group = f.label :name, class: 'control-label' .col-sm-10 = f.text_field :name, class: 'form-control', required: true .form-group = f.label :redirect_uri, class: 'control-label' .col-sm-10 = f.text_area :redirect_uri, class: 'form-control', required: true %span.help-block Use one line per URI - if Doorkeeper.configuration.native_redirect_uri %span.help-block Use %code= Doorkeeper.configuration.native_redirect_uri for local tests .form-actions = f.submit 'Submit', class: "btn btn-create" = link_to "Cancel", applications_profile_path, class: "btn btn-cancel" ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/applications/show.htm0000644000175600017570000000125512672631600031050 0ustar pravipravi- page_title @application.name, "Applications" %h3.page-title Application: #{@application.name} .table-holder %table.table %tr %td Application Id %td %code#application_id= @application.uid %tr %td Secret: %td %code#secret= @application.secret %tr %td Callback url %td - @application.redirect_uri.split.each do |uri| %div %span.monospace= uri .form-actions = link_to 'Edit', edit_oauth_application_path(@application), class: 'btn btn-primary wide pull-left' = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applications/gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applicatio0000755000175600017570000000000012672631600031171 5ustar pravipravi././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applications/_delete_form.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applicatio0000644000175600017570000000061612672631600031176 0ustar pravipravi- submit_btn_css ||= 'btn btn-link btn-remove' - if defined?(token) - path = oauth_authorized_application_path(0, token_id: token) - else - path = oauth_authorized_application_path(application) = form_tag path do %input{:name => "_method", :type => "hidden", :value => "delete"}/ = submit_tag 'Revoke', onclick: "return confirm('Are you sure?')", class: 'btn btn-link btn-remove btn-sm' ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applications/index.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorized_applicatio0000644000175600017570000000072612672631600031200 0ustar pravipravi%header.page-header %h1 Your authorized applications %main{:role => "main"} .table-holder %table.table.table-striped %thead %tr %th Application %th Created At %th %th %tbody - @applications.each do |application| %tr %td= application.name %td= application.created_at.strftime('%Y-%m-%d %H:%M:%S') %td= render 'delete_form', application: application gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/0000755000175600017570000000000012672631600027750 5ustar pravipravi././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/new.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/new.ht0000644000175600017570000000273512672631600031105 0ustar pravipravi%h3.page-title Authorize required %main{:role => "main"} %p.h4 Authorize %strong.text-info= @pre_auth.client.name to use your account? - if current_user.admin? .text-warning.prepend-top-20 %p = icon("exclamation-triangle fw") You are an admin, which means granting access to %strong #{@pre_auth.client.name} will allow them to interact with GitLab as an admin as well. Proceed with caution. - if @pre_auth.scopes #oauth-permissions %p This application will be able to: %ul.text-info - @pre_auth.scopes.each do |scope| %li= t scope, scope: [:doorkeeper, :scopes] %hr/ .actions = form_tag oauth_authorization_path, method: :post do = hidden_field_tag :client_id, @pre_auth.client.uid = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri = hidden_field_tag :state, @pre_auth.state = hidden_field_tag :response_type, @pre_auth.response_type = hidden_field_tag :scope, @pre_auth.scope = submit_tag "Authorize", class: "btn btn-success wide pull-left" = form_tag oauth_authorization_path, method: :delete do = hidden_field_tag :client_id, @pre_auth.client.uid = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri = hidden_field_tag :state, @pre_auth.state = hidden_field_tag :response_type, @pre_auth.response_type = hidden_field_tag :scope, @pre_auth.scope = submit_tag "Deny", class: "btn btn-danger prepend-left-10" ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/error.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/error.0000644000175600017570000000016512672631600031104 0ustar pravipravi%h3.page-title An error has occurred %main{:role => "main"} %pre= @pre_auth.error_response.body[:error_description]././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/show.html.hamlgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/doorkeeper/authorizations/show.h0000644000175600017570000000014312672631600031077 0ustar pravipravi%h3.page-title Authorization code: %main{:role => "main"} %code#authorization_code= params[:code]gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_reports/0000755000175600017570000000000012672631600025403 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/abuse_reports/new.html.haml0000644000175600017570000000200612672631600030000 0ustar pravipravi- page_title "Report abuse" %h3.page-title Report abuse %p Please use this form to report users who create spam issues, comments or behave inappropriately. %hr = form_for @abuse_report, html: { class: 'form-horizontal js-requires-input'} do |f| = f.hidden_field :user_id - if @abuse_report.errors.any? .alert.alert-danger - @abuse_report.errors.full_messages.each do |msg| %p= msg .form-group = f.label :user_id, class: 'control-label' .col-sm-10 - name = "#{@abuse_report.user.name} (@#{@abuse_report.user.username})" = text_field_tag :user_name, name, class: "form-control", readonly: true .form-group = f.label :message, class: 'control-label' .col-sm-10 = f.text_area :message, class: "form-control js-quick-submit", rows: 2, required: true, value: sanitize(@ref_url) .help-block Explain the problem with this user. If appropriate, provide a link to the relevant issue or comment. .form-actions = f.submit "Send report", class: "btn btn-create" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/0000755000175600017570000000000012672631600024042 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/not_found.html.haml0000644000175600017570000000023312672631600027641 0ustar pravipravi- page_title "Not Found" %h1 404 %h3 The resource you were looking for doesn't exist. %hr %p You may have mistyped the address or the page may have moved. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/access_denied.html.haml0000644000175600017570000000033612672631600030423 0ustar pravipravi- page_title "Access Denied" %h1 403 %h3 Access Denied %hr %p You are not allowed to access this page. %p Read more about project permissions #{link_to "here", help_page_path("permissions", "permissions"), class: "vlink"} gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/git_not_found.html.haml0000644000175600017570000000026612672631600030512 0ustar pravipravi- page_title "Git Resource Not Found" %h1 404 %h3 Git Resource Not found %hr %p Application can't get access to some branch or commit in your repository. It may have been moved. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/encoding.html.haml0000644000175600017570000000016312672631600027436 0ustar pravipravi- page_title "Encoding Error" %h1 500 %h3 Encoding Error %hr %p Page can't be loaded because of an encoding error. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/views/errors/omniauth_error.html.haml0000644000175600017570000000070512672631600030707 0ustar pravipravi- page_title "Auth Error" %h1 422 %h3 Sign-in using #{@provider} auth failed %hr %p Sign-in failed because #{@error}. %p There are couple of steps you can take: %ul %li Try logging in using your email %li Try logging in using your username %li If you have forgotten your password, try recovering it using #{ link_to "Password recovery", new_password_path(resource_name) } %p If none of the options work, try contacting the GitLab administrator. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/0000755000175600017570000000000012672631600023065 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/repository_import_worker.rb0000644000175600017570000000106212672631600030613 0ustar pravipraviclass RepositoryImportWorker include Sidekiq::Worker include Gitlab::ShellAdapter sidekiq_options queue: :gitlab_shell attr_accessor :project, :current_user def perform(project_id) @project = Project.find(project_id) @current_user = @project.creator result = Projects::ImportService.new(project, current_user).execute if result[:status] == :error project.update(import_error: result[:message]) project.import_fail return end project.repository.expire_emptiness_caches project.import_finish end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/post_receive.rb0000644000175600017570000000355112672631600026105 0ustar pravipraviclass PostReceive include Sidekiq::Worker include Gitlab::Identifier sidekiq_options queue: :post_receive def perform(repo_path, identifier, changes) if repo_path.start_with?(Gitlab.config.gitlab_shell.repos_path.to_s) repo_path.gsub!(Gitlab.config.gitlab_shell.repos_path.to_s, "") else log("Check gitlab.yml config for correct gitlab_shell.repos_path variable. \"#{Gitlab.config.gitlab_shell.repos_path}\" does not match \"#{repo_path}\"") end repo_path.gsub!(/\.git\z/, "") repo_path.gsub!(/\A\//, "") project = Project.find_with_namespace(repo_path) if project.nil? log("Triggered hook for non-existing project with full path \"#{repo_path} \"") return false end changes = Base64.decode64(changes) unless changes.include?(" ") changes = utf8_encode_changes(changes) changes = changes.lines changes.each do |change| oldrev, newrev, ref = change.strip.split(' ') @user ||= identify(identifier, project, newrev) unless @user log("Triggered hook for non-existing user \"#{identifier} \"") return false end if Gitlab::Git.tag_ref?(ref) GitTagPushService.new.execute(project, @user, oldrev, newrev, ref) else GitPushService.new(project, @user, oldrev: oldrev, newrev: newrev, ref: ref).execute end end end def utf8_encode_changes(changes) changes = changes.dup changes.force_encoding("UTF-8") return changes if changes.valid_encoding? # Convert non-UTF-8 branch/tag names to UTF-8 so they can be dumped as JSON. detection = CharlockHolmes::EncodingDetector.detect(changes) return changes unless detection && detection[:encoding] CharlockHolmes::Converter.convert(changes, detection[:encoding], 'UTF-8') end def log(message) Gitlab::GitLogger.error("POST-RECEIVE: #{message}") end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/new_note_worker.rb0000644000175600017570000000037212672631600026623 0ustar pravipraviclass NewNoteWorker include Sidekiq::Worker sidekiq_options queue: :default def perform(note_id, note_params) note = Note.find(note_id) NotificationService.new.new_note(note) Notes::PostProcessService.new(note).execute end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/system_hook_worker.rb0000644000175600017570000000030112672631600027341 0ustar pravipraviclass SystemHookWorker include Sidekiq::Worker sidekiq_options queue: :system_hook def perform(hook_id, data, hook_name) SystemHook.find(hook_id).execute(data, hook_name) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/project_web_hook_worker.rb0000644000175600017570000000035712672631600030333 0ustar pravipraviclass ProjectWebHookWorker include Sidekiq::Worker sidekiq_options queue: :project_web_hook def perform(hook_id, data, hook_name) data = data.with_indifferent_access WebHook.find(hook_id).execute(data, hook_name) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/repository_fork_worker.rb0000644000175600017570000000167212672631600030251 0ustar pravipraviclass RepositoryForkWorker include Sidekiq::Worker include Gitlab::ShellAdapter sidekiq_options queue: :gitlab_shell def perform(project_id, source_path, target_path) project = Project.find_by_id(project_id) unless project.present? logger.error("Project #{project_id} no longer exists!") return end result = gitlab_shell.fork_repository(source_path, target_path) unless result logger.error("Unable to fork project #{project_id} for repository #{source_path} -> #{target_path}") project.update(import_error: "The project could not be forked.") project.import_fail return end unless project.valid_repo? logger.error("Project #{id} had an invalid repository after fork") project.update(import_error: "The forked repository is invalid.") project.import_fail return end project.repository.expire_emptiness_caches project.import_finish end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/irker_worker.rb0000644000175600017570000001131612672631600026121 0ustar pravipravirequire 'json' require 'socket' class IrkerWorker include Sidekiq::Worker def perform(project_id, chans, colors, push_data, settings) project = Project.find(project_id) # Get config parameters return false unless init_perform settings, chans, colors repo_name = push_data['repository']['name'] committer = push_data['user_name'] branch = push_data['ref'].gsub(%r'refs/[^/]*/', '') if @colors repo_name = "\x0304#{repo_name}\x0f" branch = "\x0305#{branch}\x0f" end # First messages are for branch creation/deletion send_branch_updates push_data, project, repo_name, committer, branch # Next messages are for commits send_commits push_data, project, repo_name, committer, branch close_connection true end private def init_perform(set, chans, colors) @colors = colors @channels = chans start_connection set['server_host'], set['server_port'] end def start_connection(irker_server, irker_port) begin @socket = TCPSocket.new irker_server, irker_port rescue Errno::ECONNREFUSED => e logger.fatal "Can't connect to Irker daemon: #{e}" return false end true end def sendtoirker(privmsg) to_send = { to: @channels, privmsg: privmsg } @socket.puts JSON.dump(to_send) end def close_connection @socket.close end def send_branch_updates(push_data, project, repo_name, committer, branch) if Gitlab::Git.blank_ref?(push_data['before']) send_new_branch project, repo_name, committer, branch elsif Gitlab::Git.blank_ref?(push_data['after']) send_del_branch repo_name, committer, branch end end def send_new_branch(project, repo_name, committer, branch) repo_path = project.path_with_namespace newbranch = "#{Gitlab.config.gitlab.url}/#{repo_path}/branches" newbranch = "\x0302\x1f#{newbranch}\x0f" if @colors privmsg = "[#{repo_name}] #{committer} has created a new branch " privmsg += "#{branch}: #{newbranch}" sendtoirker privmsg end def send_del_branch(repo_name, committer, branch) privmsg = "[#{repo_name}] #{committer} has deleted the branch #{branch}" sendtoirker privmsg end def send_commits(push_data, project, repo_name, committer, branch) return if push_data['total_commits_count'] == 0 # Next message is for number of commit pushed, if any if Gitlab::Git.blank_ref?(push_data['before']) # Tweak on push_data["before"] in order to have a nice compare URL push_data['before'] = before_on_new_branch push_data, project end send_commits_count(push_data, project, repo_name, committer, branch) # One message per commit, limited by 3 messages (same limit as the # github irc hook) commits = push_data['commits'].first(3) commits.each do |hook_attrs| send_one_commit project, hook_attrs, repo_name, branch end end def before_on_new_branch(push_data, project) commit = commit_from_id project, push_data['commits'][0]['id'] parents = commit.parents # Return old value if there's no new one return push_data['before'] if parents.empty? # Or return the first parent-commit parents[0].id end def send_commits_count(data, project, repo, committer, branch) url = compare_url data, project.path_with_namespace commits = colorize_commits data['total_commits_count'] new_commits = 'new commit' new_commits += 's' if data['total_commits_count'] > 1 sendtoirker "[#{repo}] #{committer} pushed #{commits} #{new_commits} " \ "to #{branch}: #{url}" end def compare_url(data, repo_path) sha1 = Commit::truncate_sha(data['before']) sha2 = Commit::truncate_sha(data['after']) compare_url = "#{Gitlab.config.gitlab.url}/#{repo_path}/compare" compare_url += "/#{sha1}...#{sha2}" colorize_url compare_url end def send_one_commit(project, hook_attrs, repo_name, branch) commit = commit_from_id project, hook_attrs['id'] sha = colorize_sha Commit::truncate_sha(hook_attrs['id']) author = hook_attrs['author']['name'] files = colorize_nb_files(files_count commit) title = commit.title sendtoirker "#{repo_name}/#{branch} #{sha} #{author} (#{files}): #{title}" end def commit_from_id(project, id) project.commit(id) end def files_count(commit) files = "#{commit.diffs.count} file" files += 's' if commit.diffs.count > 1 files end def colorize_sha(sha) sha = "\x0314#{sha}\x0f" if @colors sha end def colorize_nb_files(nb_files) nb_files = "\x0312#{nb_files}\x0f" if @colors nb_files end def colorize_url(url) url = "\x0302\x1f#{url}\x0f" if @colors url end def colorize_commits(commits) commits = "\x02#{commits}\x0f" if @colors commits end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/merge_worker.rb0000644000175600017570000000063412672631600026105 0ustar pravipraviclass MergeWorker include Sidekiq::Worker sidekiq_options queue: :default def perform(merge_request_id, current_user_id, params) params = params.with_indifferent_access current_user = User.find(current_user_id) merge_request = MergeRequest.find(merge_request_id) MergeRequests::MergeService.new(merge_request.target_project, current_user, params). execute(merge_request) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/stuck_ci_builds_worker.rb0000644000175600017570000000077712672631600030164 0ustar pravipraviclass StuckCiBuildsWorker include Sidekiq::Worker BUILD_STUCK_TIMEOUT = 1.day def perform Rails.logger.info 'Cleaning stuck builds' builds = Ci::Build.running_or_pending.where('updated_at < ?', BUILD_STUCK_TIMEOUT.ago) builds.find_each(batch_size: 50).each do |build| Rails.logger.debug "Dropping stuck #{build.status} build #{build.id} for runner #{build.runner_id}" build.drop end # Update builds that failed to drop builds.update_all(status: 'failed') end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/build_email_worker.rb0000644000175600017570000000121512672631600027250 0ustar pravipraviclass BuildEmailWorker include Sidekiq::Worker def perform(build_id, recipients, push_data) recipients.each do |recipient| begin case push_data['build_status'] when 'success' Notify.build_success_email(build_id, recipient).deliver_now when 'failed' Notify.build_fail_email(build_id, recipient).deliver_now end # These are input errors and won't be corrected even if Sidekiq retries rescue Net::SMTPFatalError, Net::SMTPSyntaxError => e logger.info("Failed to send e-mail for project '#{push_data['project_name']}' to #{recipient}: #{e}") end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/gitlab_shell_worker.rb0000644000175600017570000000030412672631600027431 0ustar pravipraviclass GitlabShellWorker include Sidekiq::Worker include Gitlab::ShellAdapter sidekiq_options queue: :gitlab_shell def perform(action, *arg) gitlab_shell.send(action, *arg) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/repository_archive_cache_worker.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/repository_archive_cache_worke0000644000175600017570000000023312672631600031260 0ustar pravipraviclass RepositoryArchiveCacheWorker include Sidekiq::Worker sidekiq_options queue: :default def perform Repository.clean_old_archives end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/project_destroy_worker.rb0000644000175600017570000000054012672631600030221 0ustar pravipraviclass ProjectDestroyWorker include Sidekiq::Worker sidekiq_options queue: :default def perform(project_id, user_id, params) begin project = Project.find(project_id) rescue ActiveRecord::RecordNotFound return end user = User.find(user_id) ::Projects::DestroyService.new(project, user, params).execute end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/project_cache_worker.rb0000644000175600017570000000046612672631600027602 0ustar pravipraviclass ProjectCacheWorker include Sidekiq::Worker sidekiq_options queue: :default def perform(project_id) project = Project.find(project_id) project.update_repository_size project.update_commit_count if project.repository.root_ref project.repository.build_cache end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/project_service_worker.rb0000644000175600017570000000033112672631600030166 0ustar pravipraviclass ProjectServiceWorker include Sidekiq::Worker sidekiq_options queue: :project_web_hook def perform(hook_id, data) data = data.with_indifferent_access Service.find(hook_id).execute(data) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/email_receiver_worker.rb0000644000175600017570000000373712672631600027770 0ustar pravipraviclass EmailReceiverWorker include Sidekiq::Worker sidekiq_options queue: :incoming_email def perform(raw) return unless Gitlab::IncomingEmail.enabled? begin Gitlab::Email::Receiver.new(raw).execute rescue => e handle_failure(raw, e) end end private def handle_failure(raw, e) Rails.logger.warn("Email can not be processed: #{e}\n\n#{raw}") return unless raw.present? can_retry = false reason = nil case e when Gitlab::Email::Receiver::SentNotificationNotFoundError reason = "We couldn't figure out what the email is in reply to. Please create your comment through the web interface." when Gitlab::Email::Receiver::EmptyEmailError can_retry = true reason = "It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies." when Gitlab::Email::Receiver::AutoGeneratedEmailError reason = "The email was marked as 'auto generated', which we can't accept. Please create your comment through the web interface." when Gitlab::Email::Receiver::UserNotFoundError reason = "We couldn't figure out what user corresponds to the email. Please create your comment through the web interface." when Gitlab::Email::Receiver::UserBlockedError reason = "Your account has been blocked. If you believe this is in error, contact a staff member." when Gitlab::Email::Receiver::UserNotAuthorizedError reason = "You are not allowed to respond to the thread you are replying to. If you believe this is in error, contact a staff member." when Gitlab::Email::Receiver::NoteableNotFoundError reason = "The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member." when Gitlab::Email::Receiver::InvalidNoteError can_retry = true reason = e.message else return end EmailRejectionMailer.rejection(reason, raw, can_retry).deliver_later end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/workers/emails_on_push_worker.rb0000644000175600017570000000370712672631600030017 0ustar pravipraviclass EmailsOnPushWorker include Sidekiq::Worker def perform(project_id, recipients, push_data, options = {}) options.symbolize_keys! options.reverse_merge!( send_from_committer_email: false, disable_diffs: false ) send_from_committer_email = options[:send_from_committer_email] disable_diffs = options[:disable_diffs] project = Project.find(project_id) before_sha = push_data["before"] after_sha = push_data["after"] ref = push_data["ref"] author_id = push_data["user_id"] action = if Gitlab::Git.blank_ref?(before_sha) :create elsif Gitlab::Git.blank_ref?(after_sha) :delete else :push end compare = nil reverse_compare = false if action == :push compare = Gitlab::Git::Compare.new(project.repository.raw_repository, before_sha, after_sha) return false if compare.same if compare.commits.empty? compare = Gitlab::Git::Compare.new(project.repository.raw_repository, after_sha, before_sha) reverse_compare = true return false if compare.commits.empty? end end recipients.split(" ").each do |recipient| begin Notify.repository_push_email( project_id, recipient, author_id: author_id, ref: ref, action: action, compare: compare, reverse_compare: reverse_compare, send_from_committer_email: send_from_committer_email, disable_diffs: disable_diffs ).deliver_now # These are input errors and won't be corrected even if Sidekiq retries rescue Net::SMTPFatalError, Net::SMTPSyntaxError => e logger.info("Failed to send e-mail for project '#{project.name_with_namespace}' to #{recipient}: #{e}") end end ensure compare = nil GC.start end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/0000755000175600017570000000000012672631600023737 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/snippets_controller.rb0000644000175600017570000000511612672631600030377 0ustar pravipraviclass SnippetsController < ApplicationController before_action :snippet, only: [:show, :edit, :destroy, :update, :raw] # Allow read snippet before_action :authorize_read_snippet!, only: [:show, :raw] # Allow modify snippet before_action :authorize_update_snippet!, only: [:edit, :update] # Allow destroy snippet before_action :authorize_admin_snippet!, only: [:destroy] skip_before_action :authenticate_user!, only: [:index, :user_index, :show, :raw] layout 'snippets' respond_to :html def index if params[:username].present? @user = User.find_by(username: params[:username]) render_404 and return unless @user @snippets = SnippetsFinder.new.execute(current_user, { filter: :by_user, user: @user, scope: params[:scope] }). page(params[:page]).per(PER_PAGE) render 'index' else redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path) end end def new @snippet = PersonalSnippet.new end def create @snippet = CreateSnippetService.new(nil, current_user, snippet_params).execute respond_with @snippet.becomes(Snippet) end def edit end def update UpdateSnippetService.new(nil, current_user, @snippet, snippet_params).execute respond_with @snippet.becomes(Snippet) end def show end def destroy return access_denied! unless can?(current_user, :admin_personal_snippet, @snippet) @snippet.destroy redirect_to snippets_path end def raw send_data( @snippet.content, type: 'text/plain; charset=utf-8', disposition: 'inline', filename: @snippet.sanitized_file_name ) end protected def snippet @snippet ||= if current_user PersonalSnippet.where("author_id = ? OR visibility_level IN (?)", current_user.id, [Snippet::PUBLIC, Snippet::INTERNAL]). find(params[:id]) else PersonalSnippet.find(params[:id]) end end def authorize_read_snippet! authenticate_user! unless can?(current_user, :read_personal_snippet, @snippet) end def authorize_update_snippet! return render_404 unless can?(current_user, :update_personal_snippet, @snippet) end def authorize_admin_snippet! return render_404 unless can?(current_user, :admin_personal_snippet, @snippet) end def snippet_params params.require(:personal_snippet).permit(:title, :content, :file_name, :private, :visibility_level) end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/registrations_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/registrations_controller.r0000644000175600017570000000247412672631600031271 0ustar pravipraviclass RegistrationsController < Devise::RegistrationsController before_action :signup_enabled? include Recaptcha::Verify def new redirect_to(new_user_session_path) end def create if !Gitlab::Recaptcha.load_configurations! || verify_recaptcha super else flash[:alert] = "There was an error with the reCAPTCHA code below. Please re-enter the code." flash.delete :recaptcha_error render action: 'new' end end def destroy DeleteUserService.new(current_user).execute(current_user) respond_to do |format| format.html { redirect_to new_user_session_path, notice: "Account successfully removed." } end end protected def build_resource(hash=nil) super end def after_sign_up_path_for(_resource) new_user_session_path end def after_inactive_sign_up_path_for(_resource) new_user_session_path end private def signup_enabled? unless current_application_settings.signup_enabled? redirect_to(new_user_session_path) end end def sign_up_params params.require(:user).permit(:username, :email, :name, :password, :password_confirmation) end def resource_name :user end def resource @resource ||= User.new(sign_up_params) end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/0000755000175600017570000000000012672631600025057 5ustar pravipravi././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/authorizations_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/authorizations_contr0000644000175600017570000000262612672631600031300 0ustar pravipraviclass Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController before_action :authenticate_resource_owner! layout 'profile' def new if pre_auth.authorizable? if skip_authorization? || matching_token? auth = authorization.authorize redirect_to auth.redirect_uri else render "doorkeeper/authorizations/new" end else render "doorkeeper/authorizations/error" end end # TODO: Handle raise invalid authorization def create redirect_or_render authorization.authorize end def destroy redirect_or_render authorization.deny end private def matching_token? Doorkeeper::AccessToken.matching_token_for(pre_auth.client, current_resource_owner.id, pre_auth.scopes) end def redirect_or_render(auth) if auth.redirectable? redirect_to auth.redirect_uri else render json: auth.body, status: auth.status end end def pre_auth @pre_auth ||= Doorkeeper::OAuth::PreAuthorization.new(Doorkeeper.configuration, server.client_via_uid, params) end def authorization @authorization ||= strategy.request end def strategy @strategy ||= server.authorization_request(pre_auth.response_type) end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/applications_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/applications_control0000644000175600017570000000231112672631600031225 0ustar pravipraviclass Oauth::ApplicationsController < Doorkeeper::ApplicationsController include Gitlab::CurrentSettings include PageLayoutHelper before_action :verify_user_oauth_applications_enabled before_action :authenticate_user! layout 'profile' def index head :forbidden and return end def create @application = Doorkeeper::Application.new(application_params) @application.owner = current_user if @application.save flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) redirect_to oauth_application_url(@application) else render :new end end def destroy if @application.destroy flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) end redirect_to applications_profile_url end private def verify_user_oauth_applications_enabled return if current_application_settings.user_oauth_applications? redirect_to applications_profile_url end def set_application @application = current_user.oauth_applications.find(params[:id]) end rescue_from ActiveRecord::RecordNotFound do |exception| render "errors/not_found", layout: "errors", status: 404 end end ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/authorized_applications_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/oauth/authorized_applicati0000644000175600017570000000100312672631600031200 0ustar pravipraviclass Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsController include PageLayoutHelper layout 'profile' def destroy if params[:token_id].present? current_resource_owner.oauth_authorized_tokens.find(params[:token_id]).revoke else Doorkeeper::AccessToken.revoke_all_for(params[:id], current_resource_owner) end redirect_to applications_profile_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/invites_controller.rb0000644000175600017570000000351712672631600030216 0ustar pravipraviclass InvitesController < ApplicationController before_action :member skip_before_action :authenticate_user!, only: :decline respond_to :html def show end def accept if member.accept_invite!(current_user) label, path = source_info(member.source) redirect_to path, notice: "You have been granted #{member.human_access} access to #{label}." else redirect_back_or_default(options: { alert: "The invitation could not be accepted." }) end end def decline if member.decline_invite! label, _ = source_info(member.source) path = if current_user dashboard_projects_path else new_user_session_path end redirect_to path, notice: "You have declined the invitation to join #{label}." else redirect_back_or_default(options: { alert: "The invitation could not be declined." }) end end private def member return @member if defined?(@member) @token = params[:id] @member = Member.find_by_invite_token(@token) unless @member render_404 and return end @member end def authenticate_user! return if current_user notice = "To accept this invitation, sign in" notice << " or create an account" if current_application_settings.signup_enabled? notice << "." store_location_for :user, request.fullpath redirect_to new_user_session_path, notice: notice end def source_info(source) case source when Project project = member.source label = "project #{project.name_with_namespace}" path = namespace_project_path(project.namespace, project) when Group group = member.source label = "group #{group.name}" path = group_path(group) else label = "who knows what" path = dashboard_projects_path end [label, path] end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/search_controller.rb0000644000175600017570000000327112672631600027777 0ustar pravipraviclass SearchController < ApplicationController include SearchHelper layout 'search' def show return if params[:search].nil? || params[:search].blank? @search_term = params[:search] if params[:project_id].present? @project = Project.find_by(id: params[:project_id]) @project = nil unless can?(current_user, :download_code, @project) end if params[:group_id].present? @group = Group.find_by(id: params[:group_id]) @group = nil unless can?(current_user, :read_group, @group) end @scope = params[:scope] @show_snippets = params[:snippets].eql? 'true' @search_results = if @project unless %w(blobs notes issues merge_requests milestones wiki_blobs commits).include?(@scope) @scope = 'blobs' end Search::ProjectService.new(@project, current_user, params).execute elsif @show_snippets unless %w(snippet_blobs snippet_titles).include?(@scope) @scope = 'snippet_blobs' end Search::SnippetService.new(current_user, params).execute else unless %w(projects issues merge_requests milestones).include?(@scope) @scope = 'projects' end Search::GlobalService.new(current_user, params).execute end @objects = @search_results.objects(@scope, params[:page]) end def autocomplete term = params[:term] if params[:project_id].present? @project = Project.find_by(id: params[:project_id]) @project = nil unless can?(current_user, :read_project, @project) end @ref = params[:project_ref] if params[:project_ref].present? render json: search_autocomplete_opts(term).to_json end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/help_controller.rb0000644000175600017570000000466212672631600027467 0ustar pravipraviclass HelpController < ApplicationController skip_before_action :authenticate_user!, :reject_blocked layout 'help' def index @help_index = File.read(Rails.root.join('doc', 'README.md')) # Prefix Markdown links with `help/` unless they already have been # See http://rubular.com/r/nwwhzH6Z8X @help_index.gsub!(/(\]\()(?!help\/)([^\)\(]+)(\))/, '\1help/\2\3') end def show @category = clean_path_info(path_params[:category]) @file = path_params[:file] respond_to do |format| format.any(:markdown, :md, :html) do # Note: We are purposefully NOT using `Rails.root.join` path = File.join(Rails.root, 'doc', @category, "#{@file}.md") if File.exist?(path) @markdown = File.read(path) render 'show.html.haml' else # Force template to Haml render 'errors/not_found.html.haml', layout: 'errors', status: 404 end end # Allow access to images in the doc folder format.any(:png, :gif, :jpeg) do # Note: We are purposefully NOT using `Rails.root.join` path = File.join(Rails.root, 'doc', @category, "#{@file}.#{params[:format]}") if File.exist?(path) send_file(path, disposition: 'inline') else head :not_found end end # Any other format we don't recognize, just respond 404 format.any { head :not_found } end end def shortcuts end def ui end private def path_params params.require(:category) params.require(:file) params end PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact) # Taken from ActionDispatch::FileHandler # Cleans up the path, to prevent directory traversal outside the doc folder. def clean_path_info(path_info) parts = path_info.split(PATH_SEPS) clean = [] # Walk over each part of the path parts.each do |part| # Turn `one//two` or `one/./two` into `one/two`. next if part.empty? || part == '.' if part == '..' # Turn `one/two/../` into `one` clean.pop else # Add simple folder names to the clean path. clean << part end end # If the path was an absolute path (i.e. `/` or `/one/two`), # add `/` to the front of the clean path. clean.unshift '/' if parts.empty? || parts.first.empty? # Join all the clean path parts by the path separator. ::File.join(*clean) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/uploads_controller.rb0000644000175600017570000000274312672631600030204 0ustar pravipraviclass UploadsController < ApplicationController skip_before_action :authenticate_user! before_action :find_model, :authorize_access! def show uploader = @model.send(upload_mount) unless uploader.file_storage? return redirect_to uploader.url end unless uploader.file && uploader.file.exists? return render_404 end disposition = uploader.image? ? 'inline' : 'attachment' send_file uploader.file.path, disposition: disposition end private def find_model unless upload_model && upload_mount return render_404 end @model = upload_model.find(params[:id]) end def authorize_access! authorized = case @model when Project can?(current_user, :read_project, @model) when Group can?(current_user, :read_group, @model) when Note can?(current_user, :read_project, @model.project) else # No authentication required for user avatars. true end return if authorized if current_user render_404 else authenticate_user! end end def upload_model upload_models = { "user" => User, "project" => Project, "note" => Note, "group" => Group, "appearance" => Appearance } upload_models[params[:model]] end def upload_mount upload_mounts = %w(avatar attachment file logo header_logo) if upload_mounts.include?(params[:mounted_as]) params[:mounted_as] end end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/omniauth_callbacks_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/omniauth_callbacks_control0000644000175600017570000000777212672631600031262 0ustar pravipraviclass OmniauthCallbacksController < Devise::OmniauthCallbacksController include AuthenticatesWithTwoFactor protect_from_forgery except: [:kerberos, :saml, :cas3] Gitlab.config.omniauth.providers.each do |provider| define_method provider['name'] do handle_omniauth end end # Extend the standard message generation to accept our custom exception def failure_message exception = env["omniauth.error"] error = exception.error_reason if exception.respond_to?(:error_reason) error ||= exception.error if exception.respond_to?(:error) error ||= exception.message if exception.respond_to?(:message) error ||= env["omniauth.error.type"].to_s error.to_s.humanize if error end # We only find ourselves here # if the authentication to LDAP was successful. def ldap ldap_user = Gitlab::LDAP::User.new(oauth) ldap_user.save if ldap_user.changed? # will also save new users @user = ldap_user.gl_user @user.remember_me = params[:remember_me] if ldap_user.persisted? # Do additional LDAP checks for the user filter and EE features if ldap_user.allowed? if @user.two_factor_enabled? prompt_for_two_factor(@user) else log_audit_event(@user, with: :ldap) sign_in_and_redirect(@user) end else flash[:alert] = "Access denied for your LDAP account." redirect_to new_user_session_path end end def saml if current_user log_audit_event(current_user, with: :saml) # Update SAML identity if data has changed. identity = current_user.identities.find_by(extern_uid: oauth['uid'], provider: :saml) if identity.nil? current_user.identities.create(extern_uid: oauth['uid'], provider: :saml) redirect_to profile_account_path, notice: 'Authentication method updated' else redirect_to after_sign_in_path_for(current_user) end else saml_user = Gitlab::Saml::User.new(oauth) saml_user.save @user = saml_user.gl_user continue_login_process end end def omniauth_error @provider = params[:provider] @error = params[:error] render 'errors/omniauth_error', layout: "errors", status: 422 end def cas3 ticket = params['ticket'] if ticket handle_service_ticket oauth['provider'], ticket end handle_omniauth end private def handle_omniauth if current_user # Add new authentication method current_user.identities.find_or_create_by(extern_uid: oauth['uid'], provider: oauth['provider']) log_audit_event(current_user, with: oauth['provider']) redirect_to profile_account_path, notice: 'Authentication method updated' else oauth_user = Gitlab::OAuth::User.new(oauth) oauth_user.save @user = oauth_user.gl_user continue_login_process end rescue Gitlab::OAuth::SignupDisabledError label = Gitlab::OAuth::Provider.label_for(oauth['provider']) message = "Signing in using your #{label} account without a pre-existing GitLab account is not allowed." if current_application_settings.signup_enabled? message << " Create a GitLab account first, and then connect it to your #{label} account." end flash[:notice] = message redirect_to new_user_session_path end def handle_service_ticket provider, ticket Gitlab::OAuth::Session.create provider, ticket session[:service_tickets] ||= {} session[:service_tickets][provider] = ticket end def continue_login_process # Only allow properly saved users to login. if @user.persisted? && @user.valid? log_audit_event(@user, with: oauth['provider']) sign_in_and_redirect(@user) else error_message = @user.errors.full_messages.to_sentence redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return end end def oauth @oauth ||= request.env['omniauth.auth'] end def log_audit_event(user, options = {}) AuditEventService.new(user, user, options). for_authentication.security_event end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/passwords_controller.rb0000644000175600017570000000256212672631600030561 0ustar pravipraviclass PasswordsController < Devise::PasswordsController before_action :resource_from_email, only: [:create] before_action :prevent_ldap_reset, only: [:create] before_action :throttle_reset, only: [:create] def edit super reset_password_token = Devise.token_generator.digest( User, :reset_password_token, resource.reset_password_token ) unless reset_password_token.nil? user = User.where( reset_password_token: reset_password_token ).first_or_initialize unless user.reset_password_period_valid? flash[:alert] = 'Your password reset token has expired.' redirect_to(new_user_password_url(user_email: user['email'])) end end end protected def resource_from_email email = resource_params[:email] self.resource = resource_class.find_by_email(email) end def prevent_ldap_reset return unless resource && resource.ldap_user? redirect_to after_sending_reset_password_instructions_path_for(resource_name), alert: "Cannot reset password for LDAP user." end def throttle_reset return unless resource && resource.recently_sent_password_reset? # Throttle reset attempts, but return a normal message to # avoid user enumeration attack. redirect_to new_user_session_path, notice: I18n.t('devise.passwords.send_paranoid_instructions') end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups_controller.rb0000644000175600017570000000700212672631600030045 0ustar pravipraviclass GroupsController < Groups::ApplicationController include IssuesAction include MergeRequestsAction respond_to :html skip_before_action :authenticate_user!, only: [:index, :show, :issues, :merge_requests] before_action :group, except: [:index, :new, :create] # Authorize before_action :authorize_read_group!, except: [:index, :show, :new, :create, :autocomplete] before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects] before_action :authorize_create_group!, only: [:new, :create] # Load group projects before_action :load_projects, except: [:index, :new, :create, :projects, :edit, :update, :autocomplete] before_action :event_filter, only: [:show, :events] layout :determine_layout def index redirect_to(current_user ? dashboard_groups_path : explore_groups_path) end def new @group = Group.new end def create @group = Group.new(group_params) @group.name = @group.path.dup unless @group.name if @group.save @group.add_owner(current_user) redirect_to @group, notice: "Group '#{@group.name}' was successfully created." else render action: "new" end end def show @last_push = current_user.recent_push if current_user @projects = @projects.includes(:namespace) @projects = @projects.search(params[:filter_projects]) if params[:filter_projects].present? @projects = @projects.page(params[:page]).per(PER_PAGE) if params[:filter_projects].blank? respond_to do |format| format.html format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end format.atom do load_events render layout: false end end end def events respond_to do |format| format.json do load_events pager_json("events/_events", @events.count) end end end def edit end def projects @projects = @group.projects.page(params[:page]) end def update if @group.update_attributes(group_params) redirect_to edit_group_path(@group), notice: "Group '#{@group.name}' was successfully updated." else render action: "edit" end end def destroy DestroyGroupService.new(@group, current_user).execute redirect_to root_path, alert: "Group '#{@group.name}' was successfully deleted." end protected def group @group ||= Group.find_by(path: params[:id]) @group || render_404 end def load_projects @projects ||= ProjectsFinder.new.execute(current_user, group: group).sorted_by_activity.non_archived end # Dont allow unauthorized access to group def authorize_read_group! unless @group and (@projects.present? or can?(current_user, :read_group, @group)) if current_user.nil? return authenticate_user! else return render_404 end end end def authorize_create_group! unless can?(current_user, :create_group, nil) return render_404 end end def determine_layout if [:new, :create].include?(action_name.to_sym) 'application' elsif [:edit, :update, :projects].include?(action_name.to_sym) 'group_settings' else 'group' end end def group_params params.require(:group).permit(:name, :description, :path, :avatar, :public) end def load_events @events = Event.in_projects(@projects) @events = event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects_controller.rb0000644000175600017570000001521412672631600030363 0ustar pravipraviclass ProjectsController < ApplicationController include ExtractsPath prepend_before_action :render_go_import, only: [:show] skip_before_action :authenticate_user!, only: [:show, :activity] before_action :project, except: [:new, :create] before_action :repository, except: [:new, :create] before_action :assign_ref_vars, :tree, only: [:show], if: :repo_exists? # Authorize before_action :authorize_admin_project!, only: [:edit, :update, :housekeeping] before_action :event_filter, only: [:show, :activity] layout :determine_layout def index redirect_to(current_user ? root_path : explore_root_path) end def new @project = Project.new end def edit render 'edit' end def create @project = ::Projects::CreateService.new(current_user, project_params).execute if @project.saved? redirect_to( project_path(@project), notice: "Project '#{@project.name}' was successfully created." ) else render 'new' end end def update status = ::Projects::UpdateService.new(@project, current_user, project_params).execute respond_to do |format| if status flash[:notice] = "Project '#{@project.name}' was successfully updated." format.html do redirect_to( edit_project_path(@project), notice: "Project '#{@project.name}' was successfully updated." ) end format.js else format.html { render 'edit' } format.js end end end def transfer return access_denied! unless can?(current_user, :change_namespace, @project) namespace = Namespace.find_by(id: params[:new_namespace_id]) ::Projects::TransferService.new(project, current_user).execute(namespace) if @project.errors[:new_namespace].present? flash[:alert] = @project.errors[:new_namespace].first end end def remove_fork return access_denied! unless can?(current_user, :remove_fork_project, @project) if @project.unlink_fork flash[:notice] = 'The fork relationship has been removed.' end end def activity respond_to do |format| format.html format.json do load_events pager_json('events/_events', @events.count) end end end def show if @project.import_in_progress? redirect_to namespace_project_import_path(@project.namespace, @project) return end if @project.pending_delete? flash[:alert] = "Project queued for delete." end respond_to do |format| format.html do if @project.repository_exists? if @project.empty_repo? render 'projects/empty' else if current_user @membership = @project.team.find_member(current_user.id) end render :show end else render 'projects/no_repo' end end format.atom do load_events render layout: false end end end def destroy return access_denied! unless can?(current_user, :remove_project, @project) ::Projects::DestroyService.new(@project, current_user, {}).pending_delete! flash[:alert] = "Project '#{@project.name}' will be deleted." redirect_to dashboard_projects_path rescue Projects::DestroyService::DestroyError => ex redirect_to edit_project_path(@project), alert: ex.message end def autocomplete_sources note_type = params['type'] note_id = params['type_id'] autocomplete = ::Projects::AutocompleteService.new(@project) participants = ::Projects::ParticipantsService.new(@project, current_user).execute(note_type, note_id) @suggestions = { emojis: autocomplete_emojis, issues: autocomplete.issues, mergerequests: autocomplete.merge_requests, members: participants } respond_to do |format| format.json { render json: @suggestions } end end def archive return access_denied! unless can?(current_user, :archive_project, @project) @project.archive! respond_to do |format| format.html { redirect_to project_path(@project) } end end def unarchive return access_denied! unless can?(current_user, :archive_project, @project) @project.unarchive! respond_to do |format| format.html { redirect_to project_path(@project) } end end def housekeeping ::Projects::HousekeepingService.new(@project).execute respond_to do |format| flash[:notice] = "Housekeeping successfully started." format.html { redirect_to project_path(@project) } end end def toggle_star current_user.toggle_star(@project) @project.reload render json: { star_count: @project.star_count } end def markdown_preview text = params[:text] ext = Gitlab::ReferenceExtractor.new(@project, current_user, current_user) ext.analyze(text) render json: { body: view_context.markdown(text), references: { users: ext.users.map(&:username) } } end private def determine_layout if [:new, :create].include?(action_name.to_sym) 'application' elsif [:edit, :update].include?(action_name.to_sym) 'project_settings' else 'project' end end def load_events @events = @project.events.recent @events = event_filter.apply_filter(@events).with_associations limit = (params[:limit] || 20).to_i @events = @events.limit(limit).offset(params[:offset] || 0) end def project_params params.require(:project).permit( :name, :path, :description, :issues_tracker, :tag_list, :runners_token, :issues_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id, :default_branch, :wiki_enabled, :visibility_level, :import_url, :last_activity_at, :namespace_id, :avatar, :builds_enabled, :build_allow_git_fetch, :build_timeout_in_minutes, :build_coverage_regex, :public_builds, ) end def autocomplete_emojis Rails.cache.fetch("autocomplete-emoji-#{Gemojione::VERSION}") do Emoji.emojis.map do |name, emoji| { name: name, path: view_context.image_url("#{emoji["unicode"]}.png") } end end end def render_go_import return unless params["go-get"] == "1" @namespace = params[:namespace_id] @id = params[:project_id] || params[:id] @id = @id.gsub(/\.git\Z/, "") render "go_import", layout: false end def repo_exists? project.repository_exists? && !project.empty_repo? end # Override get_id from ExtractsPath, which returns the branch and file path # for the blob/tree, which in this case is just the root of the default branch. def get_id project.repository.root_ref end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/0000755000175600017570000000000012672631600025027 5ustar pravipravi././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/background_jobs_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/background_jobs_cont0000644000175600017570000000041412672631600031130 0ustar pravipraviclass Admin::BackgroundJobsController < Admin::ApplicationController def show ps_output, _ = Gitlab::Popen.popen(%W(ps -U #{Gitlab.config.gitlab.user} -o pid,pcpu,pmem,stat,start,command)) @sidekiq_processes = ps_output.split("\n").grep(/sidekiq/) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/builds_controller.rb0000644000175600017570000000102512672631600031077 0ustar pravipraviclass Admin::BuildsController < Admin::ApplicationController def index @scope = params[:scope] @all_builds = Ci::Build @builds = @all_builds.order('created_at DESC') @builds = case @scope when 'running' @builds.running_or_pending.reverse_order when 'finished' @builds.finished else @builds end @builds = @builds.page(params[:page]).per(30) end def cancel_all Ci::Build.running_or_pending.each(&:cancel) redirect_to admin_builds_path end end ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/broadcast_messages_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/broadcast_messages_c0000644000175600017570000000244712672631600031114 0ustar pravipraviclass Admin::BroadcastMessagesController < Admin::ApplicationController before_action :finder, only: [:edit, :update, :destroy] def index @broadcast_messages = BroadcastMessage.reorder("ends_at DESC").page(params[:page]) @broadcast_message = BroadcastMessage.new end def edit end def create @broadcast_message = BroadcastMessage.new(broadcast_message_params) if @broadcast_message.save redirect_to admin_broadcast_messages_path, notice: 'Broadcast Message was successfully created.' else render :index end end def update if @broadcast_message.update(broadcast_message_params) redirect_to admin_broadcast_messages_path, notice: 'Broadcast Message was successfully updated.' else render :edit end end def destroy @broadcast_message.destroy respond_to do |format| format.html { redirect_back_or_default(default: { action: 'index' }) } format.js { render nothing: true } end end def preview @message = broadcast_message_params[:message] end protected def finder @broadcast_message = BroadcastMessage.find(params[:id]) end def broadcast_message_params params.require(:broadcast_message).permit(%i( color ends_at font message starts_at )) end end ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/runner_projects_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/runner_projects_cont0000644000175600017570000000151212672631600031216 0ustar pravipraviclass Admin::RunnerProjectsController < Admin::ApplicationController before_action :project, only: [:create] def index @runner_projects = project.runner_projects.all @runner_project = project.runner_projects.new end def create @runner = Ci::Runner.find(params[:runner_project][:runner_id]) if @runner.assign_to(@project, current_user) redirect_to admin_runner_path(@runner) else redirect_to admin_runner_path(@runner), alert: 'Failed adding runner to project' end end def destroy rp = Ci::RunnerProject.find(params[:id]) runner = rp.runner rp.destroy redirect_to admin_runner_path(runner) end private def project @project = Project.find_with_namespace( [params[:namespace_id], '/', params[:project_id]].join('') ) @project || render_404 end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/appearances_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/appearances_controll0000644000175600017570000000243212672631600031151 0ustar pravipraviclass Admin::AppearancesController < Admin::ApplicationController before_action :set_appearance, except: :create def show end def preview end def create @appearance = Appearance.new(appearance_params) if @appearance.save redirect_to admin_appearances_path, notice: 'Appearance was successfully created.' else render action: 'show' end end def update if @appearance.update(appearance_params) redirect_to admin_appearances_path, notice: 'Appearance was successfully updated.' else render action: 'show' end end def logo @appearance.remove_logo! @appearance.save redirect_to admin_appearances_path, notice: 'Logo was succesfully removed.' end def header_logos @appearance.remove_header_logo! @appearance.save redirect_to admin_appearances_path, notice: 'Header logo was succesfully removed.' end private # Use callbacks to share common setup or constraints between actions. def set_appearance @appearance = Appearance.last || Appearance.new end # Only allow a trusted parameter "white list" through. def appearance_params params.require(:appearance).permit( :title, :description, :logo, :logo_cache, :header_logo, :header_logo_cache, :updated_by ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/groups_controller.rb0000644000175600017570000000312012672631600031132 0ustar pravipraviclass Admin::GroupsController < Admin::ApplicationController before_action :group, only: [:edit, :show, :update, :destroy, :project_update, :members_update] def index @groups = Group.all @groups = @groups.sort(@sort = params[:sort]) @groups = @groups.search(params[:name]) if params[:name].present? @groups = @groups.page(params[:page]).per(PER_PAGE) end def show @members = @group.members.order("access_level DESC").page(params[:members_page]).per(PER_PAGE) @projects = @group.projects.page(params[:projects_page]).per(PER_PAGE) end def new @group = Group.new end def edit end def create @group = Group.new(group_params) @group.name = @group.path.dup unless @group.name if @group.save @group.add_owner(current_user) redirect_to [:admin, @group], notice: 'Group was successfully created.' else render "new" end end def update if @group.update_attributes(group_params) redirect_to [:admin, @group], notice: 'Group was successfully updated.' else render "edit" end end def members_update @group.add_users(params[:user_ids].split(','), params[:access_level], current_user) redirect_to [:admin, @group], notice: 'Users were successfully added.' end def destroy DestroyGroupService.new(@group, current_user).execute redirect_to admin_groups_path, notice: 'Group was successfully deleted.' end private def group @group = Group.find_by(path: params[:id]) end def group_params params.require(:group).permit(:name, :description, :path, :avatar) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/projects_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/projects_controller.0000644000175600017570000000324212672631600031125 0ustar pravipraviclass Admin::ProjectsController < Admin::ApplicationController before_action :project, only: [:show, :transfer] before_action :group, only: [:show, :transfer] before_action :repository, only: [:show, :transfer] def index @projects = Project.all @projects = @projects.in_namespace(params[:namespace_id]) if params[:namespace_id].present? @projects = @projects.where("visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present? @projects = @projects.with_push if params[:with_push].present? @projects = @projects.abandoned if params[:abandoned].present? @projects = @projects.non_archived unless params[:with_archived].present? @projects = @projects.search(params[:name]) if params[:name].present? @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(PER_PAGE) end def show if @group @group_members = @group.members.order("access_level DESC").page(params[:group_members_page]).per(PER_PAGE) end @project_members = @project.project_members.page(params[:project_members_page]).per(PER_PAGE) end def transfer namespace = Namespace.find_by(id: params[:new_namespace_id]) ::Projects::TransferService.new(@project, current_user, params.dup).execute(namespace) @project.reload redirect_to admin_namespace_project_path(@project.namespace, @project) end protected def project @project = Project.find_with_namespace( [params[:namespace_id], '/', params[:id]].join('') ) @project || render_404 end def group @group ||= @project.group end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/logs_controller.rb0000644000175600017570000000007712672631600030567 0ustar pravipraviclass Admin::LogsController < Admin::ApplicationController end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/users_controller.rb0000644000175600017570000001024112672631600030756 0ustar pravipraviclass Admin::UsersController < Admin::ApplicationController before_action :user, except: [:index, :new, :create] def index @users = User.order_name_asc.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? @users = @users.sort(@sort = params[:sort]) @users = @users.page(params[:page]) end def show end def projects @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) end def groups end def keys @keys = user.keys end def new @user = User.new end def edit user end def block if user.block redirect_back_or_admin_user(notice: "Successfully blocked") else redirect_back_or_admin_user(alert: "Error occurred. User was not blocked") end end def unblock if user.ldap_blocked? redirect_back_or_admin_user(alert: "This user cannot be unlocked manually from GitLab") elsif user.activate redirect_back_or_admin_user(notice: "Successfully unblocked") else redirect_back_or_admin_user(alert: "Error occurred. User was not unblocked") end end def unlock if user.unlock_access! redirect_back_or_admin_user(alert: "Successfully unlocked") else redirect_back_or_admin_user(alert: "Error occurred. User was not unlocked") end end def confirm if user.confirm redirect_back_or_admin_user(notice: "Successfully confirmed") else redirect_back_or_admin_user(alert: "Error occurred. User was not confirmed") end end def disable_two_factor user.disable_two_factor! redirect_to admin_user_path(user), notice: 'Two-factor Authentication has been disabled for this user' end def create opts = { force_random_password: true, password_expires_at: nil } @user = User.new(user_params.merge(opts)) @user.created_by_id = current_user.id @user.generate_password @user.generate_reset_token @user.skip_confirmation! respond_to do |format| if @user.save format.html { redirect_to [:admin, @user], notice: 'User was successfully created.' } format.json { render json: @user, status: :created, location: @user } else format.html { render "new" } format.json { render json: @user.errors, status: :unprocessable_entity } end end end def update user_params_with_pass = user_params.dup if params[:user][:password].present? user_params_with_pass.merge!( password: params[:user][:password], password_confirmation: params[:user][:password_confirmation], ) end respond_to do |format| user.skip_reconfirmation! if user.update_attributes(user_params_with_pass) format.html { redirect_to [:admin, user], notice: 'User was successfully updated.' } format.json { head :ok } else # restore username to keep form action url. user.username = params[:id] format.html { render "edit" } format.json { render json: user.errors, status: :unprocessable_entity } end end end def destroy DeleteUserService.new(current_user).execute(user) respond_to do |format| format.html { redirect_to admin_users_path } format.json { head :ok } end end def remove_email email = user.emails.find(params[:email_id]) email.destroy user.update_secondary_emails! respond_to do |format| format.html { redirect_back_or_admin_user(notice: "Successfully removed email.") } format.js { render nothing: true } end end protected def user @user ||= User.find_by!(username: params[:id]) end def user_params params.require(:user).permit( :email, :remember_me, :bio, :name, :username, :skype, :linkedin, :twitter, :website_url, :color_scheme_id, :theme_id, :force_random_password, :extern_uid, :provider, :password_expires_at, :avatar, :hide_no_ssh_key, :hide_no_password, :projects_limit, :can_create_group, :admin, :key_id ) end def redirect_back_or_admin_user(options = {}) redirect_back_or_default(default: default_route, options: options) end def default_route [:admin, @user] end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/application_controll0000644000175600017570000000073612672631600031177 0ustar pravipravi# Provides a base class for Admin controllers to subclass # # Automatically sets the layout and ensures an administrator is logged in class Admin::ApplicationController < ApplicationController before_action :authenticate_admin! layout 'admin' def authenticate_admin! return render_404 unless current_user.is_admin? end def authorize_impersonator! if session[:impersonator_id] User.find_by!(username: session[:impersonator_id]).admin? end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/labels_controller.rb0000644000175600017570000000201712672631600031061 0ustar pravipraviclass Admin::LabelsController < Admin::ApplicationController before_action :set_label, only: [:show, :edit, :update, :destroy] def index @labels = Label.templates.page(params[:page]).per(PER_PAGE) end def show end def new @label = Label.new end def edit end def create @label = Label.new(label_params) @label.template = true if @label.save redirect_to admin_labels_url, notice: "Label was created" else render :new end end def update if @label.update(label_params) redirect_to admin_labels_path, notice: 'label was successfully updated.' else render :edit end end def destroy @label.destroy @labels = Label.templates respond_to do |format| format.html do redirect_to(admin_labels_path, notice: 'Label was removed') end format.js end end private def set_label @label = Label.find(params[:id]) end def label_params params[:label].permit(:title, :description, :color) end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/abuse_reports_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/abuse_reports_contro0000644000175600017570000000051612672631600031215 0ustar pravipraviclass Admin::AbuseReportsController < Admin::ApplicationController def index @abuse_reports = AbuseReport.order(id: :desc).page(params[:page]) end def destroy abuse_report = AbuseReport.find(params[:id]) abuse_report.remove_user if params[:remove_user] abuse_report.destroy render nothing: true end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/impersonation_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/impersonation_contro0000644000175600017570000000165712672631600031236 0ustar pravipraviclass Admin::ImpersonationController < Admin::ApplicationController skip_before_action :authenticate_admin!, only: :destroy before_action :user before_action :authorize_impersonator! def create if @user.blocked? flash[:alert] = "You cannot impersonate a blocked user" redirect_to admin_user_path(@user) else session[:impersonator_id] = current_user.username session[:impersonator_return_to] = admin_user_path(@user) warden.set_user(user, scope: 'user') flash[:alert] = "You are impersonating #{user.username}." redirect_to root_path end end def destroy redirect = session[:impersonator_return_to] warden.set_user(user, scope: 'user') session[:impersonator_return_to] = nil session[:impersonator_id] = nil redirect_to redirect || root_path end def user @user ||= User.find_by!(username: params[:id] || session[:impersonator_id]) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/keys_controller.rb0000644000175600017570000000133112672631600030570 0ustar pravipraviclass Admin::KeysController < Admin::ApplicationController before_action :user, only: [:show, :destroy] def show @key = user.keys.find(params[:id]) respond_to do |format| format.html format.js { render nothing: true } end end def destroy key = user.keys.find(params[:id]) respond_to do |format| if key.destroy format.html { redirect_to [:admin, user], notice: 'User key was successfully removed.' } else format.html { redirect_to [:admin, user], alert: 'Failed to remove user key.' } end end end protected def user @user ||= User.find_by!(username: params[:user_id]) end def key_params params.require(:user_id, :id) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/services_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/services_controller.0000644000175600017570000000262112672631600031117 0ustar pravipraviclass Admin::ServicesController < Admin::ApplicationController before_action :service, only: [:edit, :update] def index @services = services_templates end def edit unless service.present? redirect_to admin_application_settings_services_path, alert: "Service is unknown or it doesn't exist" end end def update if service.update_attributes(application_services_params[:service]) redirect_to admin_application_settings_services_path, notice: 'Application settings saved successfully' else render :edit end end private def services_templates templates = [] Service.available_services_names.each do |service_name| service_template = service_name.concat("_service").camelize.constantize templates << service_template.where(template: true).first_or_create end templates end def service @service ||= Service.where(id: params[:id], template: true).first end def application_services_params application_services_params = params.permit(:id, service: Projects::ServicesController::ALLOWED_PARAMS) if application_services_params[:service].is_a?(Hash) Projects::ServicesController::FILTER_BLANK_PARAMS.each do |param| application_services_params[:service].delete(param) if application_services_params[:service][param].blank? end end application_services_params end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/deploy_keys_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/deploy_keys_controll0000644000175600017570000000145312672631600031220 0ustar pravipraviclass Admin::DeployKeysController < Admin::ApplicationController before_action :deploy_keys, only: [:index] before_action :deploy_key, only: [:destroy] def index end def new @deploy_key = deploy_keys.new end def create @deploy_key = deploy_keys.new(deploy_key_params) if @deploy_key.save redirect_to admin_deploy_keys_path else render "new" end end def destroy deploy_key.destroy respond_to do |format| format.html { redirect_to admin_deploy_keys_path } format.json { head :ok } end end protected def deploy_key @deploy_key ||= deploy_keys.find(params[:id]) end def deploy_keys @deploy_keys ||= DeployKey.are_public end def deploy_key_params params.require(:deploy_key).permit(:key, :title) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/identities_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/identities_controlle0000644000175600017570000000251512672631600031177 0ustar pravipraviclass Admin::IdentitiesController < Admin::ApplicationController before_action :user before_action :identity, except: [:index, :new, :create] def new @identity = Identity.new end def create @identity = Identity.new(identity_params) @identity.user_id = user.id if @identity.save redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully created.' else render :new end end def index @identities = @user.identities end def edit end def update if @identity.update_attributes(identity_params) RepairLdapBlockedUserService.new(@user).execute redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully updated.' else render :edit end end def destroy if @identity.destroy RepairLdapBlockedUserService.new(@user).execute redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully removed.' else redirect_to admin_user_identities_path(@user), alert: 'Failed to remove user identity.' end end protected def user @user ||= User.find_by!(username: params[:user_id]) end def identity @identity ||= user.identities.find(params[:id]) end def identity_params params.require(:identity).permit(:provider, :extern_uid) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/spam_logs_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/spam_logs_controller0000644000175600017570000000066712672631600031212 0ustar pravipraviclass Admin::SpamLogsController < Admin::ApplicationController def index @spam_logs = SpamLog.order(id: :desc).page(params[:page]) end def destroy spam_log = SpamLog.find(params[:id]) if params[:remove_user] spam_log.remove_user redirect_to admin_spam_logs_path, notice: "User #{spam_log.user.username} was successfully removed." else spam_log.destroy render nothing: true end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/hooks_controller.rb0000644000175600017570000000156612672631600030752 0ustar pravipraviclass Admin::HooksController < Admin::ApplicationController def index @hooks = SystemHook.all @hook = SystemHook.new end def create @hook = SystemHook.new(hook_params) if @hook.save redirect_to admin_hooks_path, notice: 'Hook was successfully created.' else @hooks = SystemHook.all render :index end end def destroy @hook = SystemHook.find(params[:id]) @hook.destroy redirect_to admin_hooks_path end def test @hook = SystemHook.find(params[:hook_id]) data = { event_name: "project_create", name: "Ruby", path: "ruby", project_id: 1, owner_name: "Someone", owner_email: "example@gitlabhq.com" } @hook.execute(data, 'system_hooks') redirect_back_or_default end def hook_params params.require(:hook).permit(:url, :enable_ssl_verification) end end ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/application_settings_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/application_settings0000644000175600017570000000453012672631600031177 0ustar pravipraviclass Admin::ApplicationSettingsController < Admin::ApplicationController before_action :set_application_setting def show end def update if @application_setting.update_attributes(application_setting_params) redirect_to admin_application_settings_path, notice: 'Application settings saved successfully' else render :show end end def reset_runners_token @application_setting.reset_runners_registration_token! flash[:notice] = 'New runners registration token has been generated!' redirect_to admin_runners_path end private def set_application_setting @application_setting = ApplicationSetting.current end def application_setting_params restricted_levels = params[:application_setting][:restricted_visibility_levels] if restricted_levels.nil? params[:application_setting][:restricted_visibility_levels] = [] else restricted_levels.map! do |level| level.to_i end end import_sources = params[:application_setting][:import_sources] if import_sources.nil? params[:application_setting][:import_sources] = [] else import_sources.map! do |source| source.to_str end end params.require(:application_setting).permit( :default_projects_limit, :default_branch_protection, :signup_enabled, :signin_enabled, :require_two_factor_authentication, :two_factor_grace_period, :gravatar_enabled, :twitter_sharing_enabled, :sign_in_text, :help_page_text, :home_page_url, :after_sign_out_path, :max_attachment_size, :session_expire_delay, :default_project_visibility, :default_snippet_visibility, :restricted_signup_domains_raw, :version_check_enabled, :admin_notification_email, :user_oauth_applications, :shared_runners_enabled, :max_artifacts_size, :metrics_enabled, :metrics_host, :metrics_port, :metrics_pool_size, :metrics_timeout, :metrics_method_call_threshold, :metrics_sample_interval, :recaptcha_enabled, :recaptcha_site_key, :recaptcha_private_key, :sentry_enabled, :sentry_dsn, :akismet_enabled, :akismet_api_key, :email_author_in_body, restricted_visibility_levels: [], import_sources: [] ) end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/applications_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/applications_control0000644000175600017570000000234512672631600031204 0ustar pravipraviclass Admin::ApplicationsController < Admin::ApplicationController before_action :set_application, only: [:show, :edit, :update, :destroy] def index @applications = Doorkeeper::Application.where("owner_id IS NULL") end def show end def new @application = Doorkeeper::Application.new end def edit end def create @application = Doorkeeper::Application.new(application_params) if @application.save flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) redirect_to admin_application_url(@application) else render :new end end def update if @application.update(application_params) redirect_to admin_application_path(@application), notice: 'Application was successfully updated.' else render :edit end end def destroy @application.destroy redirect_to admin_applications_url, notice: 'Application was successfully destroyed.' end private def set_application @application = Doorkeeper::Application.where("owner_id IS NULL").find(params[:id]) end # Only allow a trusted parameter "white list" through. def application_params params[:doorkeeper_application].permit(:name, :redirect_uri) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/dashboard_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/dashboard_controller0000644000175600017570000000026212672631600031144 0ustar pravipraviclass Admin::DashboardController < Admin::ApplicationController def index @projects = Project.limit(10) @users = User.limit(10) @groups = Group.limit(10) end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/runners_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/admin/runners_controller.r0000644000175600017570000000311112672631600031145 0ustar pravipraviclass Admin::RunnersController < Admin::ApplicationController before_action :runner, except: :index def index @runners = Ci::Runner.order('id DESC') @runners = @runners.search(params[:search]) if params[:search].present? @runners = @runners.page(params[:page]).per(30) @active_runners_cnt = Ci::Runner.online.count end def show @builds = @runner.builds.order('id DESC').first(30) @projects = if params[:search].present? ::Project.search(params[:search]) else Project.all end @projects = @projects.where.not(id: @runner.projects.select(:id)) if @runner.projects.any? @projects = @projects.page(params[:page]).per(30) end def update @runner.update_attributes(runner_params) respond_to do |format| format.js format.html { redirect_to admin_runner_path(@runner) } end end def destroy @runner.destroy redirect_to admin_runners_path end def resume if @runner.update_attributes(active: true) redirect_to admin_runners_path, notice: 'Runner was successfully updated.' else redirect_to admin_runners_path, alert: 'Runner was not updated.' end end def pause if @runner.update_attributes(active: false) redirect_to admin_runners_path, notice: 'Runner was successfully updated.' else redirect_to admin_runners_path, alert: 'Runner was not updated.' end end private def runner @runner ||= Ci::Runner.find(params[:id]) end def runner_params params.require(:runner).permit(:token, :description, :tag_list, :active) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/0000755000175600017570000000000012672631600025551 5ustar pravipravi././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/file_samples_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/file_samples_cont0000644000175600017570000000025712672631600031166 0ustar pravipravimodule Sherlock class FileSamplesController < Sherlock::ApplicationController def show @file_sample = @transaction.find_file_sample(params[:id]) end end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/queries_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/queries_controlle0000644000175600017570000000023712672631600031234 0ustar pravipravimodule Sherlock class QueriesController < Sherlock::ApplicationController def show @query = @transaction.find_query(params[:id]) end end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/application_contr0000644000175600017570000000045312672631600031206 0ustar pravipravimodule Sherlock class ApplicationController < ::ApplicationController before_action :find_transaction def find_transaction if params[:transaction_id] @transaction = Gitlab::Sherlock.collection. find_transaction(params[:transaction_id]) end end end end ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/transactions_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sherlock/transactions_cont0000644000175600017570000000063212672631600031230 0ustar pravipravimodule Sherlock class TransactionsController < Sherlock::ApplicationController def index @transactions = Gitlab::Sherlock.collection.newest_first end def show @transaction = Gitlab::Sherlock.collection.find_transaction(params[:id]) render_404 unless @transaction end def destroy_all Gitlab::Sherlock.collection.clear redirect_to(:back) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/0000755000175600017570000000000012672631600025256 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/avatars_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/avatars_controller.0000644000175600017570000000025312672631600031163 0ustar pravipraviclass Groups::AvatarsController < Groups::ApplicationController def destroy @group.remove_avatar! @group.save redirect_to edit_group_path(@group) end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/milestones_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/milestones_controll0000644000175600017570000000246012672631600031301 0ustar pravipraviclass Groups::MilestonesController < Groups::ApplicationController include GlobalMilestones before_action :projects before_action :milestones, only: [:index] before_action :milestone, only: [:show, :update] before_action :authorize_group_milestone!, only: [:create, :update] def index end def new @milestone = Milestone.new end def create project_ids = params[:milestone][:project_ids] title = milestone_params[:title] @group.projects.where(id: project_ids).each do |project| Milestones::CreateService.new(project, current_user, milestone_params).execute end redirect_to milestone_path(title) end def show end def update @milestone.milestones.each do |milestone| Milestones::UpdateService.new(milestone.project, current_user, milestone_params).execute(milestone) end redirect_back_or_default(default: milestone_path(@milestone.title)) end private def authorize_group_milestone! return render_404 unless can?(current_user, :admin_milestones, group) end def milestone_params params.require(:milestone).permit(:title, :description, :due_date, :state_event) end def milestone_path(title) group_milestone_path(@group, title.to_slug.to_s, title: title) end def projects @projects ||= @group.projects end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/application_control0000644000175600017570000000121512672631600031243 0ustar pravipraviclass Groups::ApplicationController < ApplicationController layout 'group' before_action :group private def group @group ||= Group.find_by(path: params[:group_id]) end def authorize_read_group! unless @group and can?(current_user, :read_group, @group) if current_user.nil? return authenticate_user! else return render_404 end end end def authorize_admin_group! unless can?(current_user, :admin_group, group) return render_404 end end def authorize_admin_group_member! unless can?(current_user, :admin_group_member, group) return render_403 end end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/group_members_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/groups/group_members_contr0000644000175600017570000000501612672631600031256 0ustar pravipraviclass Groups::GroupMembersController < Groups::ApplicationController skip_before_action :authenticate_user!, only: [:index] # Authorize before_action :authorize_read_group! before_action :authorize_admin_group_member!, except: [:index, :leave] def index @project = @group.projects.find(params[:project_id]) if params[:project_id] @members = @group.group_members @members = @members.non_invite unless can?(current_user, :admin_group, @group) if params[:search].present? users = @group.users.search(params[:search]).to_a @members = @members.where(user_id: users) end @members = @members.order('access_level DESC').page(params[:page]).per(50) @group_member = @group.group_members.new end def create @group.add_users(params[:user_ids].split(','), params[:access_level], current_user) redirect_to group_group_members_path(@group), notice: 'Users were successfully added.' end def update @group_member = @group.group_members.find(params[:id]) return render_403 unless can?(current_user, :update_group_member, @group_member) @group_member.update_attributes(member_params) end def destroy @group_member = @group.group_members.find(params[:id]) return render_403 unless can?(current_user, :destroy_group_member, @group_member) @group_member.destroy respond_to do |format| format.html { redirect_to group_group_members_path(@group), notice: 'User was successfully removed from group.' } format.js { render nothing: true } end end def resend_invite redirect_path = group_group_members_path(@group) @group_member = @group.group_members.find(params[:id]) if @group_member.invite? @group_member.resend_invite redirect_to redirect_path, notice: 'The invitation was successfully resent.' else redirect_to redirect_path, alert: 'The invitation has already been accepted.' end end def leave @group_member = @group.group_members.find_by(user_id: current_user) if can?(current_user, :destroy_group_member, @group_member) @group_member.destroy redirect_to(dashboard_groups_path, notice: "You left #{group.name} group.") else if @group.last_owner?(current_user) redirect_to(dashboard_groups_path, alert: "You can not leave #{group.name} group because you're the last owner. Transfer or delete the group.") else return render_403 end end end protected def member_params params.require(:group_member).permit(:access_level, :user_id) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/users_controller.rb0000644000175600017570000000340712672631600027674 0ustar pravipraviclass UsersController < ApplicationController skip_before_action :authenticate_user! before_action :set_user def show @contributed_projects = contributed_projects.joined(@user).reject(&:forked?) @projects = PersonalProjectsFinder.new(@user).execute(current_user) @projects = @projects.page(params[:page]).per(PER_PAGE) @groups = @user.groups.order_id_desc respond_to do |format| format.html format.atom do load_events render layout: false end format.json do load_events pager_json("events/_events", @events.count) end end end def calendar calendar = contributions_calendar @timestamps = calendar.timestamps @starting_year = calendar.starting_year @starting_month = calendar.starting_month render 'calendar', layout: false end def calendar_activities @calendar_date = Date.parse(params[:date]) rescue nil @events = [] if @calendar_date @events = contributions_calendar.events_by_date(@calendar_date) end render 'calendar_activities', layout: false end private def set_user @user = User.find_by_username!(params[:username]) end def contributed_projects ContributedProjectsFinder.new(@user).execute(current_user) end def contributions_calendar @contributions_calendar ||= Gitlab::ContributionsCalendar. new(contributed_projects.reject(&:forked?), @user) end def load_events # Get user activity feed for projects common for both users @events = @user.recent_events. merge(projects_for_current_user). references(:project). with_associations. limit_recent(20, params[:offset]) end def projects_for_current_user ProjectsFinder.new.execute(current_user) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/root_controller.rb0000644000175600017570000000156312672631600027517 0ustar pravipravi# RootController # # This controller exists solely to handle requests to `root_url`. When a user is # logged in and has customized their `dashboard` setting, they will be # redirected to their preferred location. # # For users who haven't customized the setting, we simply delegate to # `DashboardController#show`, which is the default. class RootController < Dashboard::ProjectsController before_action :redirect_to_custom_dashboard, only: [:index] def index super end private def redirect_to_custom_dashboard return unless current_user case current_user.dashboard when 'stars' flash.keep redirect_to starred_dashboard_projects_path when 'project_activity' redirect_to activity_dashboard_path when 'starred_project_activity' redirect_to activity_dashboard_path(filter: 'starred') else return end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/0000755000175600017570000000000012672631600025666 5ustar pravipravi././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/snippets_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/snippets_control0000644000175600017570000000045512672631600031222 0ustar pravipraviclass Dashboard::SnippetsController < Dashboard::ApplicationController def index @snippets = SnippetsFinder.new.execute( current_user, filter: :by_user, user: current_user, scope: params[:scope] ) @snippets = @snippets.page(params[:page]).per(PER_PAGE) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/groups_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/groups_controlle0000644000175600017570000000025512672631600031213 0ustar pravipraviclass Dashboard::GroupsController < Dashboard::ApplicationController def index @group_members = current_user.group_members.page(params[:page]).per(PER_PAGE) end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/milestones_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/milestones_contr0000644000175600017570000000056212672631600031203 0ustar pravipraviclass Dashboard::MilestonesController < Dashboard::ApplicationController include GlobalMilestones before_action :projects before_action :milestones, only: [:index] before_action :milestone, only: [:show] def index end def show end private def projects @projects ||= current_user.authorized_projects.sorted_by_activity.non_archived end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/projects_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/projects_control0000644000175600017570000000324012672631600031201 0ustar pravipraviclass Dashboard::ProjectsController < Dashboard::ApplicationController before_action :event_filter def index @projects = current_user.authorized_projects.sorted_by_activity.non_archived @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.includes(:namespace) terms = params[:filter_projects] if terms.present? @projects = @projects.search(terms) end @projects = @projects.page(params[:page]).per(PER_PAGE) @last_push = current_user.recent_push respond_to do |format| format.html format.atom do event_filter load_events render layout: false end format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end end end def starred @projects = current_user.starred_projects @projects = @projects.includes(:namespace, :forked_from_project, :tags) @projects = @projects.sort(@sort = params[:sort]) terms = params[:filter_projects] if terms.present? @projects = @projects.search(terms) end @projects = @projects.page(params[:page]).per(PER_PAGE) @last_push = current_user.recent_push @groups = [] respond_to do |format| format.html format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end end end private def load_events @events = Event.in_projects(@projects) @events = @event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end end ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/application_cont0000644000175600017570000000013012672631600031131 0ustar pravipraviclass Dashboard::ApplicationController < ApplicationController layout 'dashboard' end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/todos_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard/todos_controller0000644000175600017570000000144712672631600031212 0ustar pravipraviclass Dashboard::TodosController < Dashboard::ApplicationController before_action :find_todos, only: [:index, :destroy_all] def index @todos = @todos.page(params[:page]).per(PER_PAGE) end def destroy todo.done! respond_to do |format| format.html { redirect_to dashboard_todos_path, notice: 'Todo was successfully marked as done.' } format.js { render nothing: true } end end def destroy_all @todos.each(&:done!) respond_to do |format| format.html { redirect_to dashboard_todos_path, notice: 'All todos were marked as done.' } format.js { render nothing: true } end end private def todo @todo ||= current_user.todos.find(params[:id]) end def find_todos @todos = TodosFinder.new(current_user, params).execute end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/ci/0000755000175600017570000000000012672631600024332 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/ci/projects_controller.rb0000644000175600017570000000230712672631600030755 0ustar pravipravimodule Ci class ProjectsController < Ci::ApplicationController before_action :project before_action :authorize_read_project!, except: [:badge] before_action :no_cache, only: [:badge] skip_before_action :authenticate_user!, only: [:badge] protect_from_forgery def show # Temporary compatibility with CI badges pointing to CI project page redirect_to namespace_project_path(project.namespace, project) end # Project status badge # Image with build status for sha or ref # # This action in DEPRECATED, this is here only for backwards compatibility # with projects migrated from GitLab CI. # def badge return render_404 unless @project image = Ci::ImageForBuildService.new.execute(@project, params) send_file image.path, filename: image.name, disposition: 'inline', type:"image/svg+xml" end protected def project @project ||= Project.find_by(ci_id: params[:id].to_i) end def no_cache response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/ci/lints_controller.rb0000644000175600017570000000131412672631600030252 0ustar pravipravimodule Ci class LintsController < ApplicationController before_action :authenticate_user! def show end def create @content = params[:content] if @content.blank? @status = false @error = "Please provide content of .gitlab-ci.yml" else @config_processor = Ci::GitlabCiYamlProcessor.new(@content) @stages = @config_processor.stages @builds = @config_processor.builds @status = true end rescue Ci::GitlabCiYamlProcessor::ValidationError, Psych::SyntaxError => e @error = e.message @status = false rescue @error = 'Undefined error' @status = false ensure render :show end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/ci/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/ci/application_controller.0000644000175600017570000000021612672631600031100 0ustar pravipravimodule Ci class ApplicationController < ::ApplicationController def self.railtie_helpers_paths "app/helpers/ci" end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/0000755000175600017570000000000012672631600025251 5ustar pravipravi././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/google_code_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/google_code_control0000644000175600017570000000640112672631600031203 0ustar pravipraviclass Import::GoogleCodeController < Import::BaseController before_action :verify_google_code_import_enabled before_action :user_map, only: [:new_user_map, :create_user_map] def new end def callback dump_file = params[:dump_file] unless dump_file.respond_to?(:read) return redirect_back_or_default(options: { alert: "You need to upload a Google Takeout archive." }) end begin dump = JSON.parse(dump_file.read) rescue return redirect_back_or_default(options: { alert: "The uploaded file is not a valid Google Takeout archive." }) end client = Gitlab::GoogleCodeImport::Client.new(dump) unless client.valid? return redirect_back_or_default(options: { alert: "The uploaded file is not a valid Google Takeout archive." }) end session[:google_code_dump] = dump if params[:create_user_map] == "1" redirect_to new_user_map_import_google_code_path else redirect_to status_import_google_code_path end end def new_user_map end def create_user_map user_map_json = params[:user_map] user_map_json = "{}" if user_map_json.blank? begin user_map = JSON.parse(user_map_json) rescue flash.now[:alert] = "The entered user map is not a valid JSON user map." render "new_user_map" and return end unless user_map.is_a?(Hash) && user_map.all? { |k, v| k.is_a?(String) && v.is_a?(String) } flash.now[:alert] = "The entered user map is not a valid JSON user map." render "new_user_map" and return end # This is the default, so let's not save it into the database. user_map.reject! do |key, value| value == Gitlab::GoogleCodeImport::Client.mask_email(key) end session[:google_code_user_map] = user_map flash[:notice] = "The user map has been saved. Continue by selecting the projects you want to import." redirect_to status_import_google_code_path end def status unless client.valid? return redirect_to new_import_google_code_path end @repos = client.repos @incompatible_repos = client.incompatible_repos @already_added_projects = current_user.created_projects.where(import_type: "google_code") already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.reject! { |repo| already_added_projects_names.include? repo.name } end def jobs jobs = current_user.created_projects.where(import_type: "google_code").to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id] repo = client.repo(@repo_id) @target_namespace = current_user.namespace @project_name = repo.name namespace = @target_namespace user_map = session[:google_code_user_map] @project = Gitlab::GoogleCodeImport::ProjectCreator.new(repo, namespace, current_user, user_map).execute end private def client @client ||= Gitlab::GoogleCodeImport::Client.new(session[:google_code_dump]) end def verify_google_code_import_enabled render_404 unless google_code_import_enabled? end def user_map @user_map ||= begin user_map = client.user_map stored_user_map = session[:google_code_user_map] user_map.update(stored_user_map) if stored_user_map Hash[user_map.sort] end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/fogbugz_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/fogbugz_controller.0000644000175600017570000000530412672631600031162 0ustar pravipraviclass Import::FogbugzController < Import::BaseController before_action :verify_fogbugz_import_enabled before_action :user_map, only: [:new_user_map, :create_user_map] rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized def new end def callback begin res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys) rescue # If the URI is invalid various errors can occur return redirect_to new_import_fogbugz_path, alert: 'Could not connect to FogBugz, check your URL' end session[:fogbugz_token] = res.get_token session[:fogbugz_uri] = params[:uri] redirect_to new_user_map_import_fogbugz_path end def new_user_map end def create_user_map user_map = params[:users] unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? } flash.now[:alert] = 'All users must have a name.' render 'new_user_map' and return end session[:fogbugz_user_map] = user_map flash[:notice] = 'The user map has been saved. Continue by selecting the projects you want to import.' redirect_to status_import_fogbugz_path end def status unless client.valid? return redirect_to new_import_fogbugz_path end @repos = client.repos @already_added_projects = current_user.created_projects.where(import_type: 'fogbugz') already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.reject! { |repo| already_added_projects_names.include? repo.name } end def jobs jobs = current_user.created_projects.where(import_type: 'fogbugz').to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id] repo = client.repo(@repo_id) fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] } @target_namespace = current_user.namespace @project_name = repo.name namespace = @target_namespace umap = session[:fogbugz_user_map] || client.user_map @project = Gitlab::FogbugzImport::ProjectCreator.new(repo, fb_session, namespace, current_user, umap).execute end private def client @client ||= Gitlab::FogbugzImport::Client.new(token: session[:fogbugz_token], uri: session[:fogbugz_uri]) end def user_map @user_map ||= begin user_map = client.user_map stored_user_map = session[:fogbugz_user_map] user_map.update(stored_user_map) if stored_user_map user_map end end def fogbugz_unauthorized(exception) redirect_to new_import_fogbugz_path, alert: exception.message end def import_params params.permit(:uri, :email, :password) end def verify_fogbugz_import_enabled render_404 unless fogbugz_import_enabled? end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/bitbucket_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/bitbucket_controlle0000644000175600017570000000552112672631600031234 0ustar pravipraviclass Import::BitbucketController < Import::BaseController before_action :verify_bitbucket_import_enabled before_action :bitbucket_auth, except: :callback rescue_from OAuth::Error, with: :bitbucket_unauthorized rescue_from Gitlab::BitbucketImport::Client::Unauthorized, with: :bitbucket_unauthorized def callback request_token = session.delete(:oauth_request_token) raise "Session expired!" if request_token.nil? request_token.symbolize_keys! access_token = client.get_token(request_token, params[:oauth_verifier], callback_import_bitbucket_url) session[:bitbucket_access_token] = access_token.token session[:bitbucket_access_token_secret] = access_token.secret redirect_to status_import_bitbucket_url end def status @repos = client.projects @incompatible_repos = client.incompatible_projects @already_added_projects = current_user.created_projects.where(import_type: "bitbucket") already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.to_a.reject!{ |repo| already_added_projects_names.include? "#{repo["owner"]}/#{repo["slug"]}" } end def jobs jobs = current_user.created_projects.where(import_type: "bitbucket").to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id] || "" repo = client.project(@repo_id.gsub("___", "/")) @project_name = repo["slug"] repo_owner = repo["owner"] repo_owner = current_user.username if repo_owner == client.user["user"]["username"] @target_namespace = params[:new_namespace].presence || repo_owner namespace = get_or_create_namespace || (render and return) unless Gitlab::BitbucketImport::KeyAdder.new(repo, current_user, access_params).execute @access_denied = true render return end @project = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client @client ||= Gitlab::BitbucketImport::Client.new(session[:bitbucket_access_token], session[:bitbucket_access_token_secret]) end def verify_bitbucket_import_enabled render_404 unless bitbucket_import_enabled? end def bitbucket_auth if session[:bitbucket_access_token].blank? go_to_bitbucket_for_permissions end end def go_to_bitbucket_for_permissions request_token = client.request_token(callback_import_bitbucket_url) session[:oauth_request_token] = request_token redirect_to client.authorize_url(request_token, callback_import_bitbucket_url) end def bitbucket_unauthorized go_to_bitbucket_for_permissions end private def access_params { bitbucket_access_token: session[:bitbucket_access_token], bitbucket_access_token_secret: session[:bitbucket_access_token_secret] } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/base_controller.rb0000644000175600017570000000104112672631600030747 0ustar pravipraviclass Import::BaseController < ApplicationController private def get_or_create_namespace begin namespace = Group.create!(name: @target_namespace, path: @target_namespace, owner: current_user) namespace.add_owner(current_user) rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid namespace = Namespace.find_by_path_or_name(@target_namespace) unless current_user.can?(:create_projects, namespace) @already_been_taken = true return false end end namespace end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/gitorious_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/gitorious_controlle0000644000175600017570000000245112672631600031303 0ustar pravipraviclass Import::GitoriousController < Import::BaseController before_action :verify_gitorious_import_enabled def new redirect_to client.authorize_url(callback_import_gitorious_url) end def callback session[:gitorious_repos] = params[:repos] redirect_to status_import_gitorious_path end def status @repos = client.repos @already_added_projects = current_user.created_projects.where(import_type: "gitorious") already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.reject! { |repo| already_added_projects_names.include? repo.full_name } end def jobs jobs = current_user.created_projects.where(import_type: "gitorious").to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id] repo = client.repo(@repo_id) @target_namespace = params[:new_namespace].presence || repo.namespace @project_name = repo.name namespace = get_or_create_namespace || (render and return) @project = Gitlab::GitoriousImport::ProjectCreator.new(repo, namespace, current_user).execute end private def client @client ||= Gitlab::GitoriousImport::Client.new(session[:gitorious_repos]) end def verify_gitorious_import_enabled render_404 unless gitorious_import_enabled? end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/github_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/github_controller.r0000644000175600017570000000347212672631600031167 0ustar pravipraviclass Import::GithubController < Import::BaseController before_action :verify_github_import_enabled before_action :github_auth, except: :callback rescue_from Octokit::Unauthorized, with: :github_unauthorized def callback session[:github_access_token] = client.get_token(params[:code]) redirect_to status_import_github_url end def status @repos = client.repos @already_added_projects = current_user.created_projects.where(import_type: "github") already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.reject!{ |repo| already_added_projects_names.include? repo.full_name } end def jobs jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id].to_i repo = client.repo(@repo_id) @project_name = repo.name repo_owner = repo.owner.login repo_owner = current_user.username if repo_owner == client.user.login @target_namespace = params[:new_namespace].presence || repo_owner namespace = get_or_create_namespace || (render and return) @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client @client ||= Gitlab::GithubImport::Client.new(session[:github_access_token]) end def verify_github_import_enabled render_404 unless github_import_enabled? end def github_auth if session[:github_access_token].blank? go_to_github_for_permissions end end def go_to_github_for_permissions redirect_to client.authorize_url(callback_import_github_url) end def github_unauthorized go_to_github_for_permissions end private def access_params { github_access_token: session[:github_access_token] } end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/gitlab_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/import/gitlab_controller.r0000644000175600017570000000360112672631600031141 0ustar pravipraviclass Import::GitlabController < Import::BaseController before_action :verify_gitlab_import_enabled before_action :gitlab_auth, except: :callback rescue_from OAuth2::Error, with: :gitlab_unauthorized def callback session[:gitlab_access_token] = client.get_token(params[:code], callback_import_gitlab_url) redirect_to status_import_gitlab_url end def status @repos = client.projects @already_added_projects = current_user.created_projects.where(import_type: "gitlab") already_added_projects_names = @already_added_projects.pluck(:import_source) @repos = @repos.to_a.reject{ |repo| already_added_projects_names.include? repo["path_with_namespace"] } end def jobs jobs = current_user.created_projects.where(import_type: "gitlab").to_json(only: [:id, :import_status]) render json: jobs end def create @repo_id = params[:repo_id].to_i repo = client.project(@repo_id) @project_name = repo["name"] repo_owner = repo["namespace"]["path"] repo_owner = current_user.username if repo_owner == client.user["username"] @target_namespace = params[:new_namespace].presence || repo_owner namespace = get_or_create_namespace || (render and return) @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client @client ||= Gitlab::GitlabImport::Client.new(session[:gitlab_access_token]) end def verify_gitlab_import_enabled render_404 unless gitlab_import_enabled? end def gitlab_auth if session[:gitlab_access_token].blank? go_to_gitlab_for_permissions end end def go_to_gitlab_for_permissions redirect_to client.authorize_url(callback_import_gitlab_url) end def gitlab_unauthorized go_to_gitlab_for_permissions end private def access_params { gitlab_access_token: session[:gitlab_access_token] } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/application_controller.rb0000644000175600017570000003207212672631600031036 0ustar pravipravirequire 'gon' require 'fogbugz' class ApplicationController < ActionController::Base include Gitlab::CurrentSettings include GitlabRoutingHelper include PageLayoutHelper PER_PAGE = 20 before_action :authenticate_user_from_token! before_action :authenticate_user! before_action :validate_user_service_ticket! before_action :reject_blocked! before_action :check_password_expiration before_action :check_2fa_requirement before_action :ldap_security_check before_action :sentry_user_context before_action :default_headers before_action :add_gon_variables before_action :configure_permitted_parameters, if: :devise_controller? before_action :require_email, unless: :devise_controller? protect_from_forgery with: :exception helper_method :abilities, :can?, :current_application_settings helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled? helper_method :repository, :can_collaborate_with_project? rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) render "errors/encoding", layout: "errors", status: 500 end rescue_from ActiveRecord::RecordNotFound do |exception| log_exception(exception) render_404 end def redirect_back_or_default(default: root_path, options: {}) redirect_to request.referer.present? ? :back : default, options end protected def sentry_user_context if Rails.env.production? && current_application_settings.sentry_enabled && current_user Raven.user_context( id: current_user.id, email: current_user.email, username: current_user.username, ) end end # From https://github.com/plataformatec/devise/wiki/How-To:-Simple-Token-Authentication-Example # https://gist.github.com/josevalim/fb706b1e933ef01e4fb6 def authenticate_user_from_token! user_token = if params[:authenticity_token].presence params[:authenticity_token].presence elsif params[:private_token].presence params[:private_token].presence elsif request.headers['PRIVATE-TOKEN'].present? request.headers['PRIVATE-TOKEN'] end user = user_token && User.find_by_authentication_token(user_token.to_s) if user # Notice we are passing store false, so the user is not # actually stored in the session and a token is needed # for every request. If you want the token to work as a # sign in token, you can simply remove store: false. sign_in user, store: false end end def authenticate_user!(*args) if redirect_to_home_page_url? redirect_to current_application_settings.home_page_url and return end super(*args) end def log_exception(exception) application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace application_trace.map!{ |t| " #{t}\n" } logger.error "\n#{exception.class.name} (#{exception.message}):\n#{application_trace.join}" end def reject_blocked! if current_user && current_user.blocked? sign_out current_user flash[:alert] = "Your account is blocked. Retry when an admin has unblocked it." redirect_to new_user_session_path end end def after_sign_in_path_for(resource) if resource.is_a?(User) && resource.respond_to?(:blocked?) && resource.blocked? sign_out resource flash[:alert] = "Your account is blocked. Retry when an admin has unblocked it." new_user_session_path else stored_location_for(:redirect) || stored_location_for(resource) || root_path end end def after_sign_out_path_for(resource) current_application_settings.after_sign_out_path || new_user_session_path end def abilities Ability.abilities end def can?(object, action, subject) abilities.allowed?(object, action, subject) end def project unless @project namespace = params[:namespace_id] id = params[:project_id] || params[:id] # Redirect from # localhost/group/project.git # to # localhost/group/project # if id =~ /\.git\Z/ redirect_to request.original_url.gsub(/\.git\/?\Z/, '') and return end project_path = "#{namespace}/#{id}" @project = Project.find_with_namespace(project_path) if @project and can?(current_user, :read_project, @project) if @project.path_with_namespace != project_path redirect_to request.original_url.gsub(project_path, @project.path_with_namespace) and return end @project elsif current_user.nil? @project = nil authenticate_user! else @project = nil render_404 and return end end @project end def repository @repository ||= project.repository end def authorize_project!(action) return access_denied! unless can?(current_user, action, project) end def access_denied! render "errors/access_denied", layout: "errors", status: 404 end def git_not_found! render "errors/git_not_found.html", layout: "errors", status: 404 end def method_missing(method_sym, *arguments, &block) if method_sym.to_s =~ /\Aauthorize_(.*)!\z/ authorize_project!($1.to_sym) else super end end def render_403 head :forbidden end def render_404 render file: Rails.root.join("public", "404"), layout: false, status: "404" end def require_non_empty_project redirect_to @project if @project.empty_repo? end def no_cache_headers response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" end def default_headers headers['X-Frame-Options'] = 'DENY' headers['X-XSS-Protection'] = '1; mode=block' headers['X-UA-Compatible'] = 'IE=edge' headers['X-Content-Type-Options'] = 'nosniff' # Enabling HSTS for non-standard ports would send clients to the wrong port if Gitlab.config.gitlab.https and Gitlab.config.gitlab.port == 443 headers['Strict-Transport-Security'] = 'max-age=31536000' end end def add_gon_variables gon.api_version = API::API.version gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s gon.default_issues_tracker = Project.new.default_issue_tracker.to_param gon.max_file_size = current_application_settings.max_attachment_size gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class if current_user gon.current_user_id = current_user.id gon.api_token = current_user.private_token end end def validate_user_service_ticket! return unless signed_in? && session[:service_tickets] valid = session[:service_tickets].all? do |provider, ticket| Gitlab::OAuth::Session.valid?(provider, ticket) end unless valid session[:service_tickets] = nil sign_out current_user redirect_to new_user_session_path end end def check_password_expiration if current_user && current_user.password_expires_at && current_user.password_expires_at < Time.now && !current_user.ldap_user? redirect_to new_profile_password_path and return end end def check_2fa_requirement if two_factor_authentication_required? && current_user && !current_user.two_factor_enabled && !skip_two_factor? redirect_to new_profile_two_factor_auth_path end end def ldap_security_check if current_user && current_user.requires_ldap_check? return unless current_user.try_obtain_ldap_lease unless Gitlab::LDAP::Access.allowed?(current_user) sign_out current_user flash[:alert] = "Access denied for your LDAP account." redirect_to new_user_session_path end end end def event_filter filters = cookies['event_filter'].split(',') if cookies['event_filter'].present? @event_filter ||= EventFilter.new(filters) end def gitlab_ldap_access(&block) Gitlab::LDAP::Access.open { |access| block.call(access) } end # JSON for infinite scroll via Pager object def pager_json(partial, count) html = render_to_string( partial, layout: false, formats: [:html] ) render json: { html: html, count: count } end def view_to_html_string(partial, locals = {}) render_to_string( partial, locals: locals, layout: false, formats: [:html] ) end def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password, :login, :remember_me, :otp_attempt) } end def hexdigest(string) Digest::SHA1.hexdigest string end def require_email if current_user && current_user.temp_oauth_email? redirect_to profile_path, notice: 'Please complete your profile with email address' and return end end def set_filters_params set_default_sort params[:scope] = 'all' if params[:scope].blank? params[:state] = 'opened' if params[:state].blank? @sort = params[:sort] @filter_params = params.dup if @project @filter_params[:project_id] = @project.id elsif @group @filter_params[:group_id] = @group.id else # TODO: this filter ignore issues/mr created in public or # internal repos where you are not a member. Enable this filter # or improve current implementation to filter only issues you # created or assigned or mentioned #@filter_params[:authorized_only] = true end @filter_params end def get_issues_collection set_filters_params @issuable_finder = IssuesFinder.new(current_user, @filter_params) @issuable_finder.execute end def get_merge_requests_collection set_filters_params @issuable_finder = MergeRequestsFinder.new(current_user, @filter_params) @issuable_finder.execute end def import_sources_enabled? !current_application_settings.import_sources.empty? end def github_import_enabled? current_application_settings.import_sources.include?('github') end def github_import_configured? Gitlab::OAuth::Provider.enabled?(:github) end def gitlab_import_enabled? request.host != 'gitlab.com' && current_application_settings.import_sources.include?('gitlab') end def gitlab_import_configured? Gitlab::OAuth::Provider.enabled?(:gitlab) end def bitbucket_import_enabled? current_application_settings.import_sources.include?('bitbucket') end def bitbucket_import_configured? Gitlab::OAuth::Provider.enabled?(:bitbucket) && Gitlab::BitbucketImport.public_key.present? end def gitorious_import_enabled? current_application_settings.import_sources.include?('gitorious') end def google_code_import_enabled? current_application_settings.import_sources.include?('google_code') end def fogbugz_import_enabled? current_application_settings.import_sources.include?('fogbugz') end def git_import_enabled? current_application_settings.import_sources.include?('git') end def two_factor_authentication_required? current_application_settings.require_two_factor_authentication end def two_factor_grace_period current_application_settings.two_factor_grace_period end def two_factor_grace_period_expired? date = current_user.otp_grace_period_started_at date && (date + two_factor_grace_period.hours) < Time.current end def skip_two_factor? session[:skip_tfa] && session[:skip_tfa] > Time.current end def redirect_to_home_page_url? # If user is not signed-in and tries to access root_path - redirect him to landing page # Don't redirect to the default URL to prevent endless redirections return false unless current_application_settings.home_page_url.present? home_page_url = current_application_settings.home_page_url.chomp('/') root_urls = [Gitlab.config.gitlab['url'].chomp('/'), root_url.chomp('/')] return false if root_urls.include?(home_page_url) current_user.nil? && root_path == request.path end def can_collaborate_with_project?(project = nil) project ||= @project can?(current_user, :push_code, project) || (current_user && current_user.already_forked?(project)) end private def set_default_sort key = if is_a_listing_page_for?('issues') || is_a_listing_page_for?('merge_requests') 'issuable_sort' end cookies[key] = params[:sort] if key && params[:sort].present? params[:sort] = cookies[key] if key params[:sort] ||= 'id_desc' end def is_a_listing_page_for?(page_type) controller_name, action_name = params.values_at(:controller, :action) (controller_name == "projects/#{page_type}" && action_name == 'index') || (controller_name == 'groups' && action_name == page_type) || (controller_name == 'dashboard' && action_name == page_type) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/0000755000175600017570000000000012672631600025570 5ustar pravipravi././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/snippets_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/snippets_controll0000644000175600017570000000512712672631600031301 0ustar pravipraviclass Projects::SnippetsController < Projects::ApplicationController before_action :module_enabled before_action :snippet, only: [:show, :edit, :destroy, :update, :raw] # Allow read any snippet before_action :authorize_read_project_snippet! # Allow write(create) snippet before_action :authorize_create_project_snippet!, only: [:new, :create] # Allow modify snippet before_action :authorize_update_project_snippet!, only: [:edit, :update] # Allow destroy snippet before_action :authorize_admin_project_snippet!, only: [:destroy] respond_to :html def index @snippets = SnippetsFinder.new.execute(current_user, { filter: :by_project, project: @project }) @snippets = @snippets.page(params[:page]).per(PER_PAGE) end def new @snippet = @noteable = @project.snippets.build end def create @snippet = CreateSnippetService.new(@project, current_user, snippet_params).execute if @snippet.valid? respond_with(@snippet, location: namespace_project_snippet_path(@project.namespace, @project, @snippet)) else render :new end end def edit end def update UpdateSnippetService.new(project, current_user, @snippet, snippet_params).execute respond_with(@snippet, location: namespace_project_snippet_path(@project.namespace, @project, @snippet)) end def show @note = @project.notes.new(noteable: @snippet) @notes = @snippet.notes.fresh @noteable = @snippet end def destroy return access_denied! unless can?(current_user, :admin_project_snippet, @snippet) @snippet.destroy redirect_to namespace_project_snippets_path(@project.namespace, @project) end def raw send_data( @snippet.content, type: 'text/plain; charset=utf-8', disposition: 'inline', filename: @snippet.sanitized_file_name ) end protected def snippet @snippet ||= @project.snippets.find(params[:id]) end def authorize_update_project_snippet! return render_404 unless can?(current_user, :update_project_snippet, @snippet) end def authorize_admin_project_snippet! return render_404 unless can?(current_user, :admin_project_snippet, @snippet) end def module_enabled return render_404 unless @project.snippets_enabled end def snippet_params params.require(:project_snippet).permit(:title, :content, :file_name, :private, :visibility_level) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/builds_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/builds_controller0000644000175600017570000000353412672631600031245 0ustar pravipraviclass Projects::BuildsController < Projects::ApplicationController before_action :build, except: [:index, :cancel_all] before_action :authorize_read_build!, except: [:cancel, :cancel_all, :retry] before_action :authorize_update_build!, except: [:index, :show, :status] layout 'project' def index @scope = params[:scope] @all_builds = project.builds @builds = @all_builds.order('created_at DESC') @builds = case @scope when 'running' @builds.running_or_pending.reverse_order when 'finished' @builds.finished else @builds end @builds = @builds.page(params[:page]).per(30) end def cancel_all @project.builds.running_or_pending.each(&:cancel) redirect_to namespace_project_builds_path(project.namespace, project) end def show @builds = @project.ci_commits.find_by_sha(@build.sha).builds.order('id DESC') @builds = @builds.where("id not in (?)", @build.id) @commit = @build.commit respond_to do |format| format.html format.json do render json: @build.to_json(methods: :trace_html) end end end def retry unless @build.retryable? return render_404 end build = Ci::Build.retry(@build) redirect_to build_path(build) end def cancel @build.cancel redirect_to build_path(@build) end def status render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha) end def erase @build.erase(erased_by: current_user) redirect_to namespace_project_build_path(project.namespace, project, @build), notice: "Build has been sucessfully erased!" end private def build @build ||= project.builds.unscoped.find_by!(id: params[:id]) end def build_path(build) namespace_project_build_path(build.project.namespace, build.project, build) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/commit_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/commit_controller0000644000175600017570000000701512672631600031251 0ustar pravipravi# Controller for a specific Commit # # Not to be confused with CommitsController, plural. class Projects::CommitController < Projects::ApplicationController include CreatesCommit # Authorize before_action :require_non_empty_project before_action :authorize_download_code!, except: [:cancel_builds, :retry_builds] before_action :authorize_update_build!, only: [:cancel_builds, :retry_builds] before_action :authorize_read_commit_status!, only: [:builds] before_action :commit before_action :define_show_vars, only: [:show, :builds] before_action :authorize_edit_tree!, only: [:revert] def show apply_diff_view_cookie! @line_notes = commit.notes.inline @note = @project.build_commit_note(commit) @notes = commit.notes.not_inline.fresh @noteable = @commit @comments_allowed = @reply_allowed = true @comments_target = { noteable_type: 'Commit', commit_id: @commit.id } respond_to do |format| format.html format.diff { render text: @commit.to_diff } format.patch { render text: @commit.to_patch } end end def builds end def cancel_builds ci_commit.builds.running_or_pending.each(&:cancel) redirect_back_or_default default: builds_namespace_project_commit_path(project.namespace, project, commit.sha) end def retry_builds ci_commit.builds.latest.failed.each do |build| if build.retryable? Ci::Build.retry(build) end end redirect_back_or_default default: builds_namespace_project_commit_path(project.namespace, project, commit.sha) end def branches @branches = @project.repository.branch_names_contains(commit.id) @tags = @project.repository.tag_names_contains(commit.id) render layout: false end def revert assign_revert_commit_vars return render_404 if @target_branch.blank? create_commit(Commits::RevertService, success_notice: "The #{revert_type_title} has been successfully reverted.", success_path: successful_revert_path, failure_path: failed_revert_path) end private def revert_type_title @commit.merged_merge_request ? 'merge request' : 'commit' end def successful_revert_path return referenced_merge_request_url if @commit.merged_merge_request namespace_project_commits_url(@project.namespace, @project, @target_branch) end def failed_revert_path return referenced_merge_request_url if @commit.merged_merge_request namespace_project_commit_url(@project.namespace, @project, params[:id]) end def referenced_merge_request_url namespace_project_merge_request_url(@project.namespace, @project, @commit.merged_merge_request) end def commit @commit ||= @project.commit(params[:id]) end def ci_commit @ci_commit ||= project.ci_commit(commit.sha) end def define_show_vars return git_not_found! unless commit if params[:w].to_i == 1 @diffs = commit.diffs({ ignore_whitespace_change: true }) else @diffs = commit.diffs end @diff_refs = [commit.parent || commit, commit] @notes_count = commit.notes.count @statuses = ci_commit.statuses if ci_commit end def assign_revert_commit_vars @commit = project.commit(params[:id]) @target_branch = params[:target_branch] @mr_source_branch = @commit.revert_branch_name @mr_target_branch = @target_branch @commit_params = { commit: @commit, revert_type_title: revert_type_title, create_merge_request: params[:create_merge_request].present? || different_project? } end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/uploads_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/uploads_controlle0000644000175600017570000000235612672631600031251 0ustar pravipraviclass Projects::UploadsController < Projects::ApplicationController skip_before_action :authenticate_user!, :reject_blocked!, :project, :repository, if: -> { action_name == 'show' && image? } def create link_to_file = ::Projects::UploadService.new(project, params[:file]). execute respond_to do |format| if link_to_file format.json do render json: { link: link_to_file } end else format.json do render json: 'Invalid file.', status: :unprocessable_entity end end end end def show return render_404 if uploader.nil? || !uploader.file.exists? disposition = uploader.image? ? 'inline' : 'attachment' send_file uploader.file.path, disposition: disposition end def uploader return @uploader if defined?(@uploader) namespace = params[:namespace_id] id = params[:project_id] file_project = Project.find_with_namespace("#{namespace}/#{id}") if file_project.nil? @uploader = nil return end @uploader = FileUploader.new(file_project, params[:secret]) @uploader.retrieve_from_store!(params[:filename]) @uploader end def image? uploader && uploader.file.exists? && uploader.image? end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/avatars_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/avatars_controlle0000644000175600017570000000124012672631600031232 0ustar pravipraviclass Projects::AvatarsController < Projects::ApplicationController before_action :project def show @blob = @repository.blob_at_branch('master', @project.avatar_in_git) if @blob headers['X-Content-Type-Options'] = 'nosniff' headers.store(*Gitlab::Workhorse.send_git_blob(@repository, @blob)) headers['Content-Disposition'] = 'inline' headers['Content-Type'] = @blob.content_type head :ok # 'render nothing: true' messes up the Content-Type else render_404 end end def destroy @project.remove_avatar! @project.save @project.reset_events_cache redirect_to edit_project_path(@project) end end ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/runner_projects_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/runner_projects_c0000644000175600017570000000121712672631600031240 0ustar pravipraviclass Projects::RunnerProjectsController < Projects::ApplicationController before_action :authorize_admin_build! layout 'project_settings' def create @runner = Ci::Runner.find(params[:runner_project][:runner_id]) return head(403) unless current_user.ci_authorized_runners.include?(@runner) path = runners_path(project) if @runner.assign_to(project, current_user) redirect_to path else redirect_to path, alert: 'Failed adding runner to project' end end def destroy runner_project = project.runner_projects.find(params[:id]) runner_project.destroy redirect_to runners_path(project) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/badges_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/badges_controller0000644000175600017570000000115212672631600031202 0ustar pravipraviclass Projects::BadgesController < Projects::ApplicationController before_action :set_no_cache def build respond_to do |format| format.html { render_404 } format.svg do image = Ci::ImageForBuildService.new.execute(project, ref: params[:ref]) send_file(image.path, filename: image.name, disposition: 'inline', type: 'image/svg+xml') end end end private def set_no_cache expires_now # Add some deprecated headers for older agents # response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT' end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/notes_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/notes_controller.0000644000175600017570000000761012672631600031170 0ustar pravipraviclass Projects::NotesController < Projects::ApplicationController # Authorize before_action :authorize_read_note! before_action :authorize_create_note!, only: [:create] before_action :authorize_admin_note!, only: [:update, :destroy] before_action :find_current_user_notes, except: [:destroy, :delete_attachment, :award_toggle] def index current_fetched_at = Time.now.to_i notes_json = { notes: [], last_fetched_at: current_fetched_at } @notes.each do |note| next if note.cross_reference_not_visible_for?(current_user) notes_json[:notes] << note_json(note) end render json: notes_json end def create @note = Notes::CreateService.new(project, current_user, note_params).execute respond_to do |format| format.json { render json: note_json(@note) } format.html { redirect_back_or_default } end end def update @note = Notes::UpdateService.new(project, current_user, note_params).execute(note) respond_to do |format| format.json { render json: note_json(@note) } format.html { redirect_back_or_default } end end def destroy if note.editable? note.destroy note.reset_events_cache end respond_to do |format| format.js { render nothing: true } end end def delete_attachment note.remove_attachment! note.update_attribute(:attachment, nil) respond_to do |format| format.js { render nothing: true } end end def award_toggle noteable = if note_params[:noteable_type] == "issue" project.issues.find(note_params[:noteable_id]) else project.merge_requests.find(note_params[:noteable_id]) end data = { author: current_user, is_award: true, note: note_params[:note].delete(":") } note = noteable.notes.find_by(data) if note note.destroy else Notes::CreateService.new(project, current_user, note_params).execute end render json: { ok: true } end private def note @note ||= @project.notes.find(params[:id]) end def note_to_html(note) render_to_string( "projects/notes/_note", layout: false, formats: [:html], locals: { note: note } ) end def note_to_discussion_html(note) return unless note.for_diff_line? if params[:view] == 'parallel' template = "projects/notes/_diff_notes_with_reply_parallel" locals = if params[:line_type] == 'old' { notes_left: [note], notes_right: [] } else { notes_left: [], notes_right: [note] } end else template = "projects/notes/_diff_notes_with_reply" locals = { notes: [note] } end render_to_string( template, layout: false, formats: [:html], locals: locals ) end def note_to_discussion_with_diff_html(note) return unless note.for_diff_line? render_to_string( "projects/notes/_discussion", layout: false, formats: [:html], locals: { discussion_notes: [note] } ) end def note_json(note) if note.valid? { valid: true, id: note.id, discussion_id: note.discussion_id, html: note_to_html(note), award: note.is_award, note: note.note, discussion_html: note_to_discussion_html(note), discussion_with_diff_html: note_to_discussion_with_diff_html(note) } else { valid: false, award: note.is_award, errors: note.errors } end end def authorize_admin_note! return access_denied! unless can?(current_user, :admin_note, note) end def note_params params.require(:note).permit( :note, :noteable, :noteable_id, :noteable_type, :project_id, :attachment, :line_code, :commit_id ) end def find_current_user_notes @notes = NotesFinder.new.execute(project, current_user, params) end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/milestones_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/milestones_contro0000644000175600017570000000610112672631600031257 0ustar pravipraviclass Projects::MilestonesController < Projects::ApplicationController before_action :module_enabled before_action :milestone, only: [:edit, :update, :destroy, :show, :sort_issues, :sort_merge_requests] # Allow read any milestone before_action :authorize_read_milestone! # Allow admin milestone before_action :authorize_admin_milestone!, except: [:index, :show] respond_to :html def index @milestones = case params[:state] when 'all' then @project.milestones.reorder(due_date: :desc, title: :asc) when 'closed' then @project.milestones.closed.reorder(due_date: :desc, title: :asc) else @project.milestones.active.reorder(due_date: :asc, title: :asc) end @milestones = @milestones.includes(:project) @milestones = @milestones.page(params[:page]).per(PER_PAGE) end def new @milestone = @project.milestones.new respond_with(@milestone) end def edit respond_with(@milestone) end def show @issues = @milestone.issues @users = @milestone.participants.uniq @merge_requests = @milestone.merge_requests @labels = @milestone.labels end def create @milestone = Milestones::CreateService.new(project, current_user, milestone_params).execute if @milestone.save redirect_to namespace_project_milestone_path(@project.namespace, @project, @milestone) else render "new" end end def update @milestone = Milestones::UpdateService.new(project, current_user, milestone_params).execute(milestone) respond_to do |format| format.js format.html do if @milestone.valid? redirect_to namespace_project_milestone_path(@project.namespace, @project, @milestone) else render :edit end end end end def destroy return access_denied! unless can?(current_user, :admin_milestone, @project) Milestones::DestroyService.new(project, current_user).execute(milestone) respond_to do |format| format.html { redirect_to namespace_project_milestones_path } format.js { render nothing: true } end end def sort_issues @milestone.sort_issues(params['sortable_issue'].map(&:to_i)) render json: { saved: true } end def sort_merge_requests @merge_requests = @milestone.merge_requests.where(id: params['sortable_merge_request']) @merge_requests.each do |merge_request| merge_request.position = params['sortable_merge_request'].index(merge_request.id.to_s) + 1 merge_request.save end render json: { saved: true } end protected def milestone @milestone ||= @project.milestones.find_by!(iid: params[:id]) end def authorize_admin_milestone! return render_404 unless can?(current_user, :admin_milestone, @project) end def module_enabled unless @project.issues_enabled || @project.merge_requests_enabled return render_404 end end def milestone_params params.require(:milestone).permit(:title, :description, :due_date, :state_event) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/graphs_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/graphs_controller0000644000175600017570000000351012672631600031241 0ustar pravipraviclass Projects::GraphsController < Projects::ApplicationController include ExtractsPath # Authorize before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! before_action :builds_enabled, only: :ci def show respond_to do |format| format.html format.json do fetch_graph end end end def commits @commits = @project.repository.commits(@ref, nil, 2000, 0, true) @commits_graph = Gitlab::Graphs::Commits.new(@commits) @commits_per_week_days = @commits_graph.commits_per_week_days @commits_per_time = @commits_graph.commits_per_time @commits_per_month = @commits_graph.commits_per_month end def ci @charts = {} @charts[:week] = Ci::Charts::WeekChart.new(project) @charts[:month] = Ci::Charts::MonthChart.new(project) @charts[:year] = Ci::Charts::YearChart.new(project) @charts[:build_times] = Ci::Charts::BuildTime.new(project) end def languages @languages = Linguist::Repository.new(@repository.rugged, @repository.rugged.head.target_id).languages total = @languages.map(&:last).sum @languages = @languages.map do |language| name, share = language color = Digest::SHA256.hexdigest(name)[0...6] { value: (share.to_f * 100 / total).round(2), label: name, color: "##{color}", highlight: "##{color}" } end @languages.sort! do |x, y| y[:value] <=> x[:value] end end private def fetch_graph @commits = @project.repository.commits(@ref, nil, 6000, 0, true) @log = [] @commits.each do |commit| @log << { author_name: commit.author_name, author_email: commit.author_email, date: commit.committed_date.strftime("%Y-%m-%d") } end render json: @log.to_json end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/imports_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/imports_controlle0000644000175600017570000000371612672631600031300 0ustar pravipraviclass Projects::ImportsController < Projects::ApplicationController # Authorize before_action :authorize_admin_project! before_action :require_no_repo, only: [:new, :create] before_action :redirect_if_progress, only: [:new, :create] before_action :redirect_if_no_import, only: :show def new end def create @project.import_url = params[:project][:import_url] if @project.save @project.reload if @project.import_failed? @project.import_retry else @project.import_start end end redirect_to namespace_project_import_path(@project.namespace, @project) end def show if @project.import_finished? if continue_params redirect_to continue_params[:to], notice: continue_params[:notice] else redirect_to namespace_project_path(@project.namespace, @project), notice: finished_notice end elsif @project.import_failed? redirect_to new_namespace_project_import_path(@project.namespace, @project) else if continue_params && continue_params[:notice_now] flash.now[:notice] = continue_params[:notice_now] end # Render end end private def continue_params continue_params = params[:continue] if continue_params continue_params.permit(:to, :notice, :notice_now) else nil end end def finished_notice if @project.forked? 'The project was successfully forked.' else 'The project was successfully imported.' end end def require_no_repo if @project.repository_exists? redirect_to namespace_project_path(@project.namespace, @project) end end def redirect_if_progress if @project.import_in_progress? redirect_to namespace_project_import_path(@project.namespace, @project) end end def redirect_if_no_import if @project.repository_exists? && @project.no_import? redirect_to namespace_project_path(@project.namespace, @project) end end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/wikis_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/wikis_controller.0000644000175600017570000000551512672631600031170 0ustar pravipravirequire 'project_wiki' class Projects::WikisController < Projects::ApplicationController before_action :authorize_read_wiki! before_action :authorize_create_wiki!, only: [:edit, :create, :history] before_action :authorize_admin_wiki!, only: :destroy before_action :load_project_wiki def pages @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE) end def show @page = @project_wiki.find_page(params[:id], params[:version_id]) if @page render 'show' elsif file = @project_wiki.find_file(params[:id], params[:version_id]) if file.on_disk? send_file file.on_disk_path, disposition: 'inline' else send_data( file.raw_data, type: file.mime_type, disposition: 'inline', filename: file.name ) end else return render('empty') unless can?(current_user, :create_wiki, @project) @page = WikiPage.new(@project_wiki) @page.title = params[:id] render 'edit' end end def edit @page = @project_wiki.find_page(params[:id]) end def update @page = @project_wiki.find_page(params[:id]) return render('empty') unless can?(current_user, :create_wiki, @project) if @page.update(content, format, message) redirect_to( namespace_project_wiki_path(@project.namespace, @project, @page), notice: 'Wiki was successfully updated.' ) else render 'edit' end end def create @page = WikiPage.new(@project_wiki) if @page.create(wiki_params) redirect_to( namespace_project_wiki_path(@project.namespace, @project, @page), notice: 'Wiki was successfully updated.' ) else render action: "edit" end end def history @page = @project_wiki.find_page(params[:id]) unless @page redirect_to( namespace_project_wiki_path(@project.namespace, @project, :home), notice: "Page not found" ) end end def destroy @page = @project_wiki.find_page(params[:id]) @page.delete if @page redirect_to( namespace_project_wiki_path(@project.namespace, @project, :home), notice: "Page was successfully deleted" ) end def git_access end private def load_project_wiki @project_wiki = ProjectWiki.new(@project, current_user) # Call #wiki to make sure the Wiki Repo is initialized @project_wiki.wiki rescue ProjectWiki::CouldNotCreateWikiError flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." redirect_to project_path(@project) return false end def wiki_params params[:wiki].slice(:title, :content, :format, :message) end def content params[:wiki][:content] end def format params[:wiki][:format] end def message params[:wiki][:message] end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/tree_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/tree_controller.r0000644000175600017570000000325712672631600031164 0ustar pravipravi# Controller for viewing a repository's file structure class Projects::TreeController < Projects::ApplicationController include ExtractsPath include CreatesCommit include ActionView::Helpers::SanitizeHelper before_action :require_non_empty_project, except: [:new, :create] before_action :assign_ref_vars before_action :assign_dir_vars, only: [:create_dir] before_action :authorize_download_code! before_action :authorize_edit_tree!, only: [:create_dir] def show return render_404 unless @repository.commit(@ref) if tree.entries.empty? if @repository.blob_at(@commit.id, @path) redirect_to( namespace_project_blob_path(@project.namespace, @project, File.join(@ref, @path)) ) and return elsif @path.present? return render_404 end end respond_to do |format| format.html # Disable cache so browser history works format.js { no_cache_headers } end end def create_dir return render_404 unless @commit_params.values.all? create_commit(Files::CreateDirService, success_notice: "The directory has been successfully created.", success_path: namespace_project_tree_path(@project.namespace, @project, File.join(@target_branch, @dir_name)), failure_path: namespace_project_tree_path(@project.namespace, @project, @ref)) end private def assign_dir_vars @target_branch = params[:target_branch] @dir_name = File.join(@path, params[:dir_name]) @commit_params = { file_path: @dir_name, commit_message: params[:commit_message], } end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/artifacts_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/artifacts_control0000644000175600017570000000201612672631600031232 0ustar pravipraviclass Projects::ArtifactsController < Projects::ApplicationController layout 'project' before_action :authorize_read_build! def download unless artifacts_file.file_storage? return redirect_to artifacts_file.url end unless artifacts_file.exists? return render_404 end send_file artifacts_file.path, disposition: 'attachment' end def browse return render_404 unless build.artifacts? directory = params[:path] ? "#{params[:path]}/" : '' @entry = build.artifacts_metadata_entry(directory) return render_404 unless @entry.exists? end def file entry = build.artifacts_metadata_entry(params[:path]) if entry.exists? render json: { archive: build.artifacts_file.path, entry: Base64.encode64(entry.path) } else render json: {}, status: 404 end end private def build @build ||= project.builds.unscoped.find_by!(id: params[:build_id]) end def artifacts_file @artifacts_file ||= build.artifacts_file end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/blame_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/blame_controller.0000644000175600017570000000057612672631600031124 0ustar pravipravi# Controller for viewing a file's blame class Projects::BlameController < Projects::ApplicationController include ExtractsPath before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! def show @blob = @repository.blob_at(@commit.id, @path) @blame_groups = Gitlab::Blame.new(@blob, @commit).groups end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/releases_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/releases_controll0000644000175600017570000000124412672631600031233 0ustar pravipraviclass Projects::ReleasesController < Projects::ApplicationController # Authorize before_action :require_non_empty_project before_action :authorize_download_code! before_action :authorize_push_code! before_action :tag before_action :release def edit end def update release.update_attributes(release_params) redirect_to namespace_project_tag_path(@project.namespace, @project, @tag.name) end private def tag @tag ||= @repository.find_tag(params[:tag_id]) end def release @release ||= @project.releases.find_or_initialize_by(tag: @tag.name) end def release_params params.require(:release).permit(:description) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/raw_controller.rb0000644000175600017570000000250012672631600031146 0ustar pravipravi# Controller for viewing a file's raw class Projects::RawController < Projects::ApplicationController include ExtractsPath before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! def show @blob = @repository.blob_at(@commit.id, @path) if @blob headers['X-Content-Type-Options'] = 'nosniff' if @blob.lfs_pointer? send_lfs_object else headers.store(*Gitlab::Workhorse.send_git_blob(@repository, @blob)) headers['Content-Disposition'] = 'inline' headers['Content-Type'] = get_blob_type head :ok # 'render nothing: true' messes up the Content-Type end else render_404 end end private def get_blob_type if @blob.text? 'text/plain; charset=utf-8' elsif @blob.image? @blob.content_type else 'application/octet-stream' end end def send_lfs_object lfs_object = find_lfs_object if lfs_object && lfs_object.project_allowed_access?(@project) send_file lfs_object.file.path, filename: @blob.name, disposition: 'attachment' else render_404 end end def find_lfs_object lfs_object = LfsObject.find_by_oid(@blob.lfs_oid) if lfs_object && lfs_object.file.exists? lfs_object else nil end end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/application_contr0000644000175600017570000000176512672631600031234 0ustar pravipraviclass Projects::ApplicationController < ApplicationController before_action :project before_action :repository layout 'project' def authenticate_user! # Restrict access to Projects area only # for non-signed users if !current_user id = params[:project_id] || params[:id] project_with_namespace = "#{params[:namespace_id]}/#{id}" @project = Project.find_with_namespace(project_with_namespace) return if @project && @project.public? end super end def require_branch_head unless @repository.branch_names.include?(@ref) redirect_to( namespace_project_tree_path(@project.namespace, @project, @ref), notice: "This action is not allowed unless you are on a branch" ) end end private def apply_diff_view_cookie! view = params[:view] || cookies[:diff_view] cookies.permanent[:diff_view] = params[:view] = view if view end def builds_enabled return render_404 unless @project.builds_enabled? end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/branches_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/branches_controll0000644000175600017570000000340012672631600031211 0ustar pravipraviclass Projects::BranchesController < Projects::ApplicationController include ActionView::Helpers::SanitizeHelper # Authorize before_action :require_non_empty_project before_action :authorize_download_code! before_action :authorize_push_code!, only: [:new, :create, :destroy] def index @sort = params[:sort] || 'name' @branches = @repository.branches_sorted_by(@sort) @branches = Kaminari.paginate_array(@branches).page(params[:page]).per(PER_PAGE) @max_commits = @branches.reduce(0) do |memo, branch| diverging_commit_counts = repository.diverging_commit_counts(branch) [memo, diverging_commit_counts[:behind], diverging_commit_counts[:ahead]].max end end def recent @branches = @repository.recent_branches end def create branch_name = sanitize(strip_tags(params[:branch_name])) branch_name = Addressable::URI.unescape(branch_name) ref = sanitize(strip_tags(params[:ref])) ref = Addressable::URI.unescape(ref) result = CreateBranchService.new(project, current_user). execute(branch_name, ref) if result[:status] == :success @branch = result[:branch] redirect_to namespace_project_tree_path(@project.namespace, @project, @branch.name) else @error = result[:message] render action: 'new' end end def destroy @branch_name = Addressable::URI.unescape(params[:id]) status = DeleteBranchService.new(project, current_user).execute(@branch_name) respond_to do |format| format.html do redirect_to namespace_project_branches_path(@project.namespace, @project) end format.js { render status: status[:return_code] } end end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/labels_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/labels_controller0000644000175600017570000000363512672631600031227 0ustar pravipraviclass Projects::LabelsController < Projects::ApplicationController before_action :module_enabled before_action :label, only: [:edit, :update, :destroy] before_action :authorize_read_label! before_action :authorize_admin_labels!, except: [:index] respond_to :js, :html def index @labels = @project.labels.page(params[:page]).per(PER_PAGE) end def new @label = @project.labels.new end def create @label = @project.labels.create(label_params) if @label.valid? redirect_to namespace_project_labels_path(@project.namespace, @project) else render 'new' end end def edit end def update if @label.update_attributes(label_params) redirect_to namespace_project_labels_path(@project.namespace, @project) else render 'edit' end end def generate Gitlab::IssuesLabels.generate(@project) if params[:redirect] == 'issues' redirect_to namespace_project_issues_path(@project.namespace, @project) elsif params[:redirect] == 'merge_requests' redirect_to namespace_project_merge_requests_path(@project.namespace, @project) else redirect_to namespace_project_labels_path(@project.namespace, @project) end end def destroy @label.destroy respond_to do |format| format.html do redirect_to(namespace_project_labels_path(@project.namespace, @project), notice: 'Label was removed') end format.js end end protected def module_enabled unless @project.issues_enabled || @project.merge_requests_enabled return render_404 end end def label_params params.require(:label).permit(:title, :description, :color) end def label @label = @project.labels.find(params[:id]) end def authorize_admin_labels! return render_404 unless can?(current_user, :admin_label, @project) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/forks_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/forks_controller.0000644000175600017570000000411712672631600031163 0ustar pravipraviclass Projects::ForksController < Projects::ApplicationController # Authorize before_action :require_non_empty_project before_action :authorize_download_code! def index base_query = project.forks.includes(:creator) @forks = if current_user base_query.where('projects.visibility_level IN (?) OR projects.id IN (?)', Project.public_and_internal_levels, current_user.authorized_projects.pluck(:id)) else base_query.where('projects.visibility_level = ?', Project::PUBLIC) end @total_forks_count = base_query.size @private_forks_count = @total_forks_count - @forks.size @public_forks_count = @total_forks_count - @private_forks_count @sort = params[:sort] || 'id_desc' @forks = @forks.order_by(@sort).page(params[:page]).per(PER_PAGE) end def new @namespaces = current_user.manageable_namespaces @namespaces.delete(@project.namespace) end def create namespace = Namespace.find(params[:namespace_key]) @forked_project = namespace.projects.find_by(path: project.path) @forked_project = nil unless @forked_project && @forked_project.forked_from_project == project @forked_project ||= ::Projects::ForkService.new(project, current_user, namespace: namespace).execute if @forked_project.saved? && @forked_project.forked? if @forked_project.import_in_progress? redirect_to namespace_project_import_path(@forked_project.namespace, @forked_project, continue: continue_params) else if continue_params redirect_to continue_params[:to], notice: continue_params[:notice] else redirect_to namespace_project_path(@forked_project.namespace, @forked_project), notice: "The project '#{@forked_project.name}' was successfully forked." end end else render :error end end private def continue_params continue_params = params[:continue] if continue_params continue_params.permit(:to, :notice, :notice_now) else nil end end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/services_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/services_controll0000644000175600017570000000502012672631600031247 0ustar pravipraviclass Projects::ServicesController < Projects::ApplicationController ALLOWED_PARAMS = [:title, :token, :type, :active, :api_key, :api_url, :api_version, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, :build_key, :server, :teamcity_url, :drone_url, :build_type, :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :colorize_messages, :channels, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events, :notify_only_broken_builds, :add_pusher, :send_from_committer_email, :disable_diffs, :external_wiki_url, :notify, :color, :server_host, :server_port, :default_irc_uri, :enable_ssl_verification, :jira_issue_transition_id] # Parameters to ignore if no value is specified FILTER_BLANK_PARAMS = [:password] # Authorize before_action :authorize_admin_project! before_action :service, only: [:edit, :update, :test] respond_to :html layout "project_settings" def index @project.build_missing_services @services = @project.services.visible.reload end def edit end def update if @service.update_attributes(service_params) redirect_to( edit_namespace_project_service_path(@project.namespace, @project, @service.to_param, notice: 'Successfully updated.') ) else render 'edit' end end def test data = Gitlab::PushDataBuilder.build_sample(project, current_user) outcome = @service.test(data) if outcome[:success] message = { notice: 'We sent a request to the provided URL' } else error_message = "We tried to send a request to the provided URL but an error occurred" error_message << ": #{outcome[:result]}" if outcome[:result].present? message = { alert: error_message } end redirect_back_or_default(options: message) end private def service @service ||= @project.services.find { |service| service.to_param == params[:id] } end def service_params service_params = params.require(:service).permit(ALLOWED_PARAMS) FILTER_BLANK_PARAMS.each do |param| service_params.delete(param) if service_params[param].blank? end service_params end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/triggers_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/triggers_controll0000644000175600017570000000127412672631600031261 0ustar pravipraviclass Projects::TriggersController < Projects::ApplicationController before_action :authorize_admin_build! layout 'project_settings' def index @triggers = project.triggers @trigger = Ci::Trigger.new end def create @trigger = project.triggers.new @trigger.save if @trigger.valid? redirect_to namespace_project_triggers_path(@project.namespace, @project) else @triggers = project.triggers.select(&:persisted?) render :index end end def destroy trigger.destroy redirect_to namespace_project_triggers_path(@project.namespace, @project) end private def trigger @trigger ||= project.triggers.find(params[:id]) end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/blob_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/blob_controller.r0000644000175600017570000001123012672631600031131 0ustar pravipravi# Controller for viewing a file's blame class Projects::BlobController < Projects::ApplicationController include ExtractsPath include CreatesCommit include ActionView::Helpers::SanitizeHelper # Raised when given an invalid file path class InvalidPathError < StandardError; end before_action :require_non_empty_project, except: [:new, :create] before_action :authorize_download_code! before_action :authorize_edit_tree!, only: [:new, :create, :edit, :update, :destroy] before_action :assign_blob_vars before_action :commit, except: [:new, :create] before_action :blob, except: [:new, :create] before_action :from_merge_request, only: [:edit, :update] before_action :require_branch_head, only: [:edit, :update] before_action :editor_variables, except: [:show, :preview, :diff] def new commit unless @repository.empty? end def create create_commit(Files::CreateService, success_notice: "The file has been successfully created.", success_path: namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)), failure_view: :new, failure_path: namespace_project_new_blob_path(@project.namespace, @project, @ref)) end def show end def edit @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha blob.load_all_data!(@repository) end def update after_edit_path = if from_merge_request && @target_branch == @ref diffs_namespace_project_merge_request_path(from_merge_request.target_project.namespace, from_merge_request.target_project, from_merge_request) + "#file-path-#{hexdigest(@path)}" else namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @path)) end create_commit(Files::UpdateService, success_path: after_edit_path, failure_view: :edit, failure_path: namespace_project_blob_path(@project.namespace, @project, @id)) end def preview @content = params[:content] @blob.load_all_data!(@repository) diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true) diff_lines = diffy.diff.scan(/.*\n/)[2..-1] diff_lines = Gitlab::Diff::Parser.new.parse(diff_lines) @diff_lines = Gitlab::Diff::Highlight.new(diff_lines).highlight render layout: false end def destroy create_commit(Files::DeleteService, success_notice: "The file has been successfully deleted.", success_path: namespace_project_tree_path(@project.namespace, @project, @target_branch), failure_view: :show, failure_path: namespace_project_blob_path(@project.namespace, @project, @id)) end def diff @form = UnfoldForm.new(params) @lines = Gitlab::Highlight.highlight_lines(repository, @ref, @path) @lines = @lines[@form.since - 1..@form.to - 1] if @form.bottom? @match_line = '' else lines_length = @lines.length - 1 line = [@form.since, lines_length].join(',') @match_line = "@@ -#{line}+#{line} @@" end render layout: false end private def blob @blob ||= @repository.blob_at(@commit.id, @path) if @blob @blob else if tree = @repository.tree(@commit.id, @path) if tree.entries.any? redirect_to namespace_project_tree_path(@project.namespace, @project, File.join(@ref, @path)) and return end end return render_404 end end def commit @commit = @repository.commit(@ref) return render_404 unless @commit end def assign_blob_vars @id = params[:id] @ref, @path = extract_ref(@id) rescue InvalidPathError render_404 end def from_merge_request # If blob edit was initiated from merge request page @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id]) end def editor_variables @target_branch = params[:target_branch] @file_path = if action_name.to_s == 'create' if params[:file].present? params[:file_name] = params[:file].original_filename end File.join(@path, params[:file_name]) else @path end if params[:file].present? params[:content] = Base64.encode64(params[:file].read) params[:encoding] = 'base64' end @commit_params = { file_path: @file_path, commit_message: params[:commit_message], file_content: params[:content], file_content_encoding: params[:encoding] } end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/deploy_keys_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/deploy_keys_contr0000644000175600017570000000303212672631600031245 0ustar pravipraviclass Projects::DeployKeysController < Projects::ApplicationController respond_to :html # Authorize before_action :authorize_admin_project! layout "project_settings" def index @enabled_keys = @project.deploy_keys @available_keys = accessible_keys - @enabled_keys @available_project_keys = current_user.project_deploy_keys - @enabled_keys @available_public_keys = DeployKey.are_public - @enabled_keys # Public keys that are already used by another accessible project are already # in @available_project_keys. @available_public_keys -= @available_project_keys end def new @key = @project.deploy_keys.new respond_with(@key) end def create @key = DeployKey.new(deploy_key_params) if @key.valid? && @project.deploy_keys << @key redirect_to namespace_project_deploy_keys_path(@project.namespace, @project) else render "new" end end def enable @key = accessible_keys.find(params[:id]) @project.deploy_keys << @key redirect_to namespace_project_deploy_keys_path(@project.namespace, @project) end def disable @project.deploy_keys_projects.find_by(deploy_key_id: params[:id]).destroy redirect_back_or_default(default: { action: 'index' }) end protected def accessible_keys @accessible_keys ||= current_user.accessible_deploy_keys end def deploy_key_params params.require(:deploy_key).permit(:key, :title) end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/refs_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/refs_controller.r0000644000175600017570000000451412672631600031161 0ustar pravipraviclass Projects::RefsController < Projects::ApplicationController include ExtractsPath include TreeHelper before_action :require_non_empty_project before_action :validate_ref_id before_action :assign_ref_vars before_action :authorize_download_code! def switch respond_to do |format| format.html do new_path = case params[:destination] when "tree" namespace_project_tree_path(@project.namespace, @project, @id) when "blob" namespace_project_blob_path(@project.namespace, @project, @id) when "graph" namespace_project_network_path(@project.namespace, @project, @id, @options) when "graphs" namespace_project_graph_path(@project.namespace, @project, @id) when "find_file" namespace_project_find_file_path(@project.namespace, @project, @id) when "graphs_commits" commits_namespace_project_graph_path(@project.namespace, @project, @id) else namespace_project_commits_path(@project.namespace, @project, @id) end redirect_to new_path end format.js do @ref = params[:ref] define_tree_vars tree render "tree" end end end def logs_tree @offset = if params[:offset].present? params[:offset].to_i else 0 end @limit = 25 @path = params[:path] contents = [] contents.push(*tree.trees) contents.push(*tree.blobs) contents.push(*tree.submodules) @logs = contents[@offset, @limit].to_a.map do |content| file = @path ? File.join(@path, content.name) : content.name last_commit = @repo.last_commit_for_path(@commit.id, file) { file_name: content.name, commit: last_commit } end if @logs.present? @log_url = namespace_project_tree_url(@project.namespace, @project, tree_join(@ref, @path || '/')) @more_log_url = logs_file_namespace_project_ref_path(@project.namespace, @project, @ref, @path || '', offset: (@offset + @limit)) end respond_to do |format| format.html { render_404 } format.js end end private def validate_ref_id return not_found! if params[:id].present? && params[:id] !~ Gitlab::Regex.git_reference_regex end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/find_file_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/find_file_control0000644000175600017570000000116312672631600031173 0ustar pravipravi# Controller for viewing a repository's file structure class Projects::FindFileController < Projects::ApplicationController include ExtractsPath include ActionView::Helpers::SanitizeHelper include TreeHelper before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! def show return render_404 unless @repository.commit(@ref) respond_to do |format| format.html end end def list file_paths = @repo.ls_files(@ref) respond_to do |format| format.json { render json: file_paths } end end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/compare_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/compare_controlle0000644000175600017570000000250612672631600031225 0ustar pravipravirequire 'addressable/uri' class Projects::CompareController < Projects::ApplicationController # Authorize before_action :require_non_empty_project before_action :authorize_download_code! before_action :assign_ref_vars, only: [:index, :show] before_action :merge_request, only: [:index, :show] def index end def show diff_options = { ignore_whitespace_change: true } if params[:w] == '1' compare_result = CompareService.new. execute(@project, @head_ref, @project, @base_ref, diff_options) if compare_result @commits = Commit.decorate(compare_result.commits, @project) @diffs = compare_result.diffs @commit = @project.commit(@head_ref) @base_commit = @project.merge_base_commit(@base_ref, @head_ref) @diff_refs = [@base_commit, @commit] @line_notes = [] end end def create redirect_to namespace_project_compare_path(@project.namespace, @project, params[:from], params[:to]) end private def assign_ref_vars @base_ref = Addressable::URI.unescape(params[:from]) @ref = @head_ref = Addressable::URI.unescape(params[:to]) end def merge_request @merge_request ||= @project.merge_requests.opened. find_by(source_project: @project, source_branch: @head_ref, target_branch: @base_ref) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/hooks_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/hooks_controller.0000644000175600017570000000247012672631600031162 0ustar pravipraviclass Projects::HooksController < Projects::ApplicationController # Authorize before_action :authorize_admin_project! respond_to :html layout "project_settings" def index @hooks = @project.hooks @hook = ProjectHook.new end def create @hook = @project.hooks.new(hook_params) @hook.save if @hook.valid? redirect_to namespace_project_hooks_path(@project.namespace, @project) else @hooks = @project.hooks.select(&:persisted?) render :index end end def test if !@project.empty_repo? status, message = TestHookService.new.execute(hook, current_user) if status flash[:notice] = 'Hook successfully executed.' else flash[:alert] = "Hook execution failed: #{message}" end else flash[:alert] = 'Hook execution failed. Ensure the project has commits.' end redirect_back_or_default(default: { action: 'index' }) end def destroy hook.destroy redirect_to namespace_project_hooks_path(@project.namespace, @project) end private def hook @hook ||= @project.hooks.find(params[:id]) end def hook_params params.require(:hook).permit(:url, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events, :enable_ssl_verification) end end ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/project_members_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/project_members_c0000644000175600017570000000645612672631600031210 0ustar pravipraviclass Projects::ProjectMembersController < Projects::ApplicationController # Authorize before_action :authorize_admin_project_member!, except: :leave def index @project_members = @project.project_members @project_members = @project_members.non_invite unless can?(current_user, :admin_project, @project) if params[:search].present? users = @project.users.search(params[:search]).to_a @project_members = @project_members.where(user_id: users) end @project_members = @project_members.order('access_level DESC') @group = @project.group if @group @group_members = @group.group_members @group_members = @group_members.non_invite unless can?(current_user, :admin_group, @group) if params[:search].present? users = @group.users.search(params[:search]).to_a @group_members = @group_members.where(user_id: users) end @group_members = @group_members.order('access_level DESC') end @project_member = @project.project_members.new end def create @project.team.add_users(params[:user_ids].split(','), params[:access_level], current_user) redirect_to namespace_project_project_members_path(@project.namespace, @project) end def update @project_member = @project.project_members.find(params[:id]) return render_403 unless can?(current_user, :update_project_member, @project_member) @project_member.update_attributes(member_params) end def destroy @project_member = @project.project_members.find(params[:id]) return render_403 unless can?(current_user, :destroy_project_member, @project_member) @project_member.destroy respond_to do |format| format.html do redirect_to namespace_project_project_members_path(@project.namespace, @project) end format.js { render nothing: true } end end def resend_invite redirect_path = namespace_project_project_members_path(@project.namespace, @project) @project_member = @project.project_members.find(params[:id]) if @project_member.invite? @project_member.resend_invite redirect_to redirect_path, notice: 'The invitation was successfully resent.' else redirect_to redirect_path, alert: 'The invitation has already been accepted.' end end def leave @project_member = @project.project_members.find_by(user_id: current_user) if can?(current_user, :destroy_project_member, @project_member) @project_member.destroy respond_to do |format| format.html { redirect_to dashboard_projects_path, notice: "You left the project." } format.js { render nothing: true } end else if current_user == @project.owner message = 'You can not leave your own project. Transfer or delete the project.' redirect_back_or_default(default: { action: 'index' }, options: { alert: message }) else render_403 end end end def apply_import giver = Project.find(params[:source_project_id]) status = @project.team.import(giver, current_user) notice = status ? "Successfully imported" : "Import failed" redirect_to(namespace_project_project_members_path(project.namespace, project), notice: notice) end protected def member_params params.require(:project_member).permit(:user_id, :access_level) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/issues_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/issues_controller0000644000175600017570000001027012672631600031271 0ustar pravipraviclass Projects::IssuesController < Projects::ApplicationController before_action :module_enabled before_action :issue, only: [:edit, :update, :show, :toggle_subscription] # Allow read any issue before_action :authorize_read_issue! # Allow write(create) issue before_action :authorize_create_issue!, only: [:new, :create] # Allow modify issue before_action :authorize_update_issue!, only: [:edit, :update] # Allow issues bulk update before_action :authorize_admin_issues!, only: [:bulk_update] # Cross-reference merge requests before_action :closed_by_merge_requests, only: [:show] respond_to :html def index terms = params['issue_search'] @issues = get_issues_collection if terms.present? if terms =~ /\A#(\d+)\z/ @issues = @issues.where(iid: $1) else @issues = @issues.full_search(terms) end end @issues = @issues.page(params[:page]).per(PER_PAGE) @label = @project.labels.find_by(title: params[:label_name]) respond_to do |format| format.html format.atom { render layout: false } format.json do render json: { html: view_to_html_string("projects/issues/_issues") } end end end def new params[:issue] ||= ActionController::Parameters.new( assignee_id: "" ) @issue = @noteable = @project.issues.new(issue_params) respond_with(@issue) end def edit respond_with(@issue) end def show @note = @project.notes.new(noteable: @issue) @notes = @issue.notes.nonawards.with_associations.fresh @noteable = @issue @merge_requests = @issue.referenced_merge_requests(current_user) respond_with(@issue) end def create @issue = Issues::CreateService.new(project, current_user, issue_params).execute respond_to do |format| format.html do if @issue.valid? redirect_to issue_path(@issue) else render :new end end format.js do |format| @link = @issue.attachment.url.to_js end end end def update @issue = Issues::UpdateService.new(project, current_user, issue_params).execute(issue) respond_to do |format| format.js format.html do if @issue.valid? redirect_to issue_path(@issue) else render :edit end end format.json do render json: { saved: @issue.valid?, assignee_avatar_url: @issue.assignee.try(:avatar_url) } end end end def bulk_update result = Issues::BulkUpdateService.new(project, current_user, bulk_update_params).execute redirect_back_or_default(default: { action: 'index' }, options: { notice: "#{result[:count]} issues updated" }) end def toggle_subscription @issue.toggle_subscription(current_user) render nothing: true end def closed_by_merge_requests @closed_by_merge_requests ||= @issue.closed_by_merge_requests(current_user) end protected def issue @issue ||= begin @project.issues.find_by!(iid: params[:id]) rescue ActiveRecord::RecordNotFound redirect_old end end def authorize_update_issue! return render_404 unless can?(current_user, :update_issue, @issue) end def authorize_admin_issues! return render_404 unless can?(current_user, :admin_issue, @project) end def module_enabled return render_404 unless @project.issues_enabled && @project.default_issues_tracker? end # Since iids are implemented only in 6.1 # user may navigate to issue page using old global ids. # # To prevent 404 errors we provide a redirect to correct iids until 7.0 release # def redirect_old issue = @project.issues.find_by(id: params[:id]) if issue redirect_to issue_path(issue) return else raise ActiveRecord::RecordNotFound.new end end def issue_params params.require(:issue).permit( :title, :assignee_id, :position, :description, :milestone_id, :state_event, :task_num, label_ids: [] ) end def bulk_update_params params.require(:update).permit( :issues_ids, :assignee_id, :milestone_id, :state_event ) end end ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/merge_requests_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/merge_requests_co0000644000175600017570000002413712672631600031235 0ustar pravipraviclass Projects::MergeRequestsController < Projects::ApplicationController before_action :module_enabled before_action :merge_request, only: [ :edit, :update, :show, :diffs, :commits, :builds, :merge, :merge_check, :ci_status, :toggle_subscription, :cancel_merge_when_build_succeeds ] before_action :closes_issues, only: [:edit, :update, :show, :diffs, :commits, :builds] before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds] before_action :define_show_vars, only: [:show, :diffs, :commits, :builds] before_action :define_widget_vars, only: [:merge, :cancel_merge_when_build_succeeds, :merge_check] before_action :ensure_ref_fetched, only: [:show, :diffs, :commits, :builds] # Allow read any merge_request before_action :authorize_read_merge_request! # Allow write(create) merge_request before_action :authorize_create_merge_request!, only: [:new, :create] # Allow modify merge_request before_action :authorize_update_merge_request!, only: [:close, :edit, :update, :sort] def index terms = params['issue_search'] @merge_requests = get_merge_requests_collection if terms.present? if terms =~ /\A[#!](\d+)\z/ @merge_requests = @merge_requests.where(iid: $1) else @merge_requests = @merge_requests.full_search(terms) end end @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE) @merge_requests = @merge_requests.preload(:target_project) @label = @project.labels.find_by(title: params[:label_name]) respond_to do |format| format.html format.json do render json: { html: view_to_html_string("projects/merge_requests/_merge_requests") } end end end def show @note_counts = Note.where(commit_id: @merge_request.commits.map(&:id)). group(:commit_id).count respond_to do |format| format.html format.json { render json: @merge_request } format.diff { render text: @merge_request.to_diff(current_user) } format.patch { render text: @merge_request.to_patch(current_user) } end end def diffs apply_diff_view_cookie! @commit = @merge_request.last_commit @base_commit = @merge_request.diff_base_commit # MRs created before 8.4 don't have a diff_base_commit, # but we need it for the "View file @ ..." link by deleted files @base_commit ||= @merge_request.first_commit.parent || @merge_request.first_commit @comments_allowed = @reply_allowed = true @comments_target = { noteable_type: 'MergeRequest', noteable_id: @merge_request.id } @line_notes = @merge_request.notes.where("line_code is not null") respond_to do |format| format.html format.json { render json: { html: view_to_html_string("projects/merge_requests/show/_diffs") } } end end def commits respond_to do |format| format.html { render 'show' } format.json { render json: { html: view_to_html_string('projects/merge_requests/show/_commits') } } end end def builds respond_to do |format| format.html { render 'show' } format.json { render json: { html: view_to_html_string('projects/merge_requests/show/_builds') } } end end def new params[:merge_request] ||= ActionController::Parameters.new(source_project: @project) @merge_request = MergeRequests::BuildService.new(project, current_user, merge_request_params).execute @noteable = @merge_request @target_branches = if @merge_request.target_project @merge_request.target_project.repository.branch_names else [] end @target_project = merge_request.target_project @source_project = merge_request.source_project @commits = @merge_request.compare_commits.reverse @commit = @merge_request.last_commit @base_commit = @merge_request.diff_base_commit @diffs = @merge_request.compare_diffs @ci_commit = @merge_request.ci_commit @statuses = @ci_commit.statuses if @ci_commit @note_counts = Note.where(commit_id: @commits.map(&:id)). group(:commit_id).count end def create @target_branches ||= [] @merge_request = MergeRequests::CreateService.new(project, current_user, merge_request_params).execute if @merge_request.valid? redirect_to(merge_request_path(@merge_request)) else @source_project = @merge_request.source_project @target_project = @merge_request.target_project render action: "new" end end def edit @source_project = @merge_request.source_project @target_project = @merge_request.target_project @target_branches = @merge_request.target_project.repository.branch_names end def update @merge_request = MergeRequests::UpdateService.new(project, current_user, merge_request_params).execute(@merge_request) if @merge_request.valid? respond_to do |format| format.js format.html do redirect_to([@merge_request.target_project.namespace.becomes(Namespace), @merge_request.target_project, @merge_request]) end format.json do render json: { saved: @merge_request.valid?, assignee_avatar_url: @merge_request.assignee.try(:avatar_url) } end end else render "edit" end end def merge_check @merge_request.check_if_can_be_merged render partial: "projects/merge_requests/widget/show.html.haml", layout: false end def cancel_merge_when_build_succeeds return access_denied! unless @merge_request.can_cancel_merge_when_build_succeeds?(current_user) MergeRequests::MergeWhenBuildSucceedsService.new(@project, current_user).cancel(@merge_request) end def merge return access_denied! unless @merge_request.can_be_merged_by?(current_user) unless @merge_request.mergeable? @status = :failed return end TodoService.new.merge_merge_request(merge_request, current_user) @merge_request.update(merge_error: nil) if params[:merge_when_build_succeeds].present? && @merge_request.ci_commit && @merge_request.ci_commit.active? MergeRequests::MergeWhenBuildSucceedsService.new(@project, current_user, merge_params) .execute(@merge_request) @status = :merge_when_build_succeeds else MergeWorker.perform_async(@merge_request.id, current_user.id, params) @status = :success end end def branch_from #This is always source @source_project = @merge_request.nil? ? @project : @merge_request.source_project @commit = @repository.commit(params[:ref]) if params[:ref].present? end def branch_to @target_project = selected_target_project @commit = @target_project.commit(params[:ref]) if params[:ref].present? end def update_branches @target_project = selected_target_project @target_branches = @target_project.repository.branch_names respond_to do |format| format.js end end def ci_status ci_service = @merge_request.source_project.ci_service status = ci_service.commit_status(merge_request.last_commit.sha, merge_request.source_branch) if ci_service.respond_to?(:commit_coverage) coverage = ci_service.commit_coverage(merge_request.last_commit.sha, merge_request.source_branch) end response = { status: status, coverage: coverage } render json: response end def toggle_subscription @merge_request.toggle_subscription(current_user) render nothing: true end protected def selected_target_project if @project.id.to_s == params[:target_project_id] || @project.forked_project_link.nil? @project else @project.forked_project_link.forked_from_project end end def merge_request @merge_request ||= @project.merge_requests.find_by!(iid: params[:id]) end def closes_issues @closes_issues ||= @merge_request.closes_issues end def authorize_update_merge_request! return render_404 unless can?(current_user, :update_merge_request, @merge_request) end def authorize_admin_merge_request! return render_404 unless can?(current_user, :admin_merge_request, @merge_request) end def module_enabled return render_404 unless @project.merge_requests_enabled end def validates_merge_request # If source project was removed (Ex. mr from fork to origin) return invalid_mr unless @merge_request.source_project # Show git not found page # if there is no saved commits between source & target branch if @merge_request.commits.blank? # and if target branch doesn't exist return invalid_mr unless @merge_request.target_branch_exists? # or if source branch doesn't exist return invalid_mr unless @merge_request.source_branch_exists? end end def define_show_vars # Build a note object for comment form @note = @project.notes.new(noteable: @merge_request) @notes = @merge_request.mr_and_commit_notes.nonawards.inc_author.fresh @discussions = Note.discussions_from_notes(@notes) @noteable = @merge_request # Get commits from repository # or from cache if already merged @commits = @merge_request.commits @merge_request_diff = @merge_request.merge_request_diff @ci_commit = @merge_request.ci_commit @statuses = @ci_commit.statuses if @ci_commit if @merge_request.locked_long_ago? @merge_request.unlock_mr @merge_request.close end end def define_widget_vars @ci_commit = @merge_request.ci_commit closes_issues end def invalid_mr # Render special view for MR with removed source or target branch render 'invalid' end def merge_request_params params.require(:merge_request).permit( :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :state_event, :description, :task_num, label_ids: [] ) end def merge_params params.permit(:should_remove_source_branch, :commit_message) end # Make sure merge requests created before 8.0 # have head file in refs/merge-requests/ def ensure_ref_fetched @merge_request.ensure_ref_fetched end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/tags_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/tags_controller.r0000644000175600017570000000245312672631600031160 0ustar pravipraviclass Projects::TagsController < Projects::ApplicationController # Authorize before_action :require_non_empty_project before_action :authorize_download_code! before_action :authorize_push_code!, only: [:new, :create] before_action :authorize_admin_project!, only: [:destroy] def index sorted = VersionSorter.rsort(@repository.tag_names) @tags = Kaminari.paginate_array(sorted).page(params[:page]).per(PER_PAGE) @releases = project.releases.where(tag: @tags) end def show @tag = @repository.find_tag(params[:id]) @release = @project.releases.find_or_initialize_by(tag: @tag.name) @commit = @repository.commit(@tag.target) end def create result = CreateTagService.new(@project, current_user). execute(params[:tag_name], params[:ref], params[:message], params[:release_description]) if result[:status] == :success @tag = result[:tag] redirect_to namespace_project_tag_path(@project.namespace, @project, @tag.name) else @error = result[:message] render action: 'new' end end def destroy DeleteTagService.new(project, current_user).execute(params[:id]) respond_to do |format| format.html do redirect_to namespace_project_tags_path(@project.namespace, @project) end format.js end end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/variables_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/variables_control0000644000175600017570000000102712672631600031223 0ustar pravipraviclass Projects::VariablesController < Projects::ApplicationController before_action :authorize_admin_build! layout 'project_settings' def show end def update if project.update_attributes(project_params) redirect_to namespace_project_variables_path(project.namespace, project), notice: 'Variables were successfully updated.' else render action: 'show' end end private def project_params params.require(:project).permit({ variables_attributes: [:id, :key, :value, :_destroy] }) end end ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/protected_branches_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/protected_branche0000644000175600017570000000257112672631600031173 0ustar pravipraviclass Projects::ProtectedBranchesController < Projects::ApplicationController # Authorize before_action :require_non_empty_project before_action :authorize_admin_project! layout "project_settings" def index @branches = @project.protected_branches.to_a @protected_branch = @project.protected_branches.new end def create @project.protected_branches.create(protected_branch_params) redirect_to namespace_project_protected_branches_path(@project.namespace, @project) end def update protected_branch = @project.protected_branches.find(params[:id]) if protected_branch && protected_branch.update_attributes( developers_can_push: params[:developers_can_push] ) respond_to do |format| format.json { render json: protected_branch, status: :ok } end else respond_to do |format| format.json { render json: protected_branch.errors, status: :unprocessable_entity } end end end def destroy @project.protected_branches.find(params[:id]).destroy respond_to do |format| format.html { redirect_to namespace_project_protected_branches_path } format.js { render nothing: true } end end private def protected_branch_params params.require(:protected_branch).permit(:name, :developers_can_push) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/commits_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/commits_controlle0000644000175600017570000000174412672631600031255 0ustar pravipravirequire "base64" class Projects::CommitsController < Projects::ApplicationController include ExtractsPath before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! def show @limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i search = params[:search] @commits = if search.present? @repository.find_commits_by_message(search, @ref, @path, @limit, @offset).compact else @repository.commits(@ref, @path, @limit, @offset) end @note_counts = project.notes.where(commit_id: @commits.map(&:id)). group(:commit_id).count @merge_request = @project.merge_requests.opened. find_by(source_project: @project, source_branch: @ref, target_branch: @repository.root_ref) respond_to do |format| format.html format.json { pager_json("projects/commits/_commits", @commits.size) } format.atom { render layout: false } end end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/runners_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/runners_controlle0000644000175600017570000000332512672631600031273 0ustar pravipraviclass Projects::RunnersController < Projects::ApplicationController before_action :authorize_admin_build! before_action :set_runner, only: [:edit, :update, :destroy, :pause, :resume, :show] layout 'project_settings' def index @runners = project.runners.ordered @specific_runners = current_user.ci_authorized_runners. where.not(id: project.runners). ordered.page(params[:page]).per(20) @shared_runners = Ci::Runner.shared.active @shared_runners_count = @shared_runners.count(:all) end def edit end def update if @runner.update_attributes(runner_params) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else redirect_to runner_path(@runner), alert: 'Runner was not updated.' end end def destroy if @runner.only_for?(project) @runner.destroy end redirect_to runners_path(@project) end def resume if @runner.update_attributes(active: true) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else redirect_to runner_path(@runner), alert: 'Runner was not updated.' end end def pause if @runner.update_attributes(active: false) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else redirect_to runner_path(@runner), alert: 'Runner was not updated.' end end def show end def toggle_shared_runners project.toggle!(:shared_runners_enabled) redirect_to namespace_project_runners_path(project.namespace, project) end protected def set_runner @runner ||= project.runners.find(params[:id]) end def runner_params params.require(:runner).permit(:description, :tag_list, :active) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/network_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/network_controlle0000644000175600017570000000121412672631600031263 0ustar pravipraviclass Projects::NetworkController < Projects::ApplicationController include ExtractsPath include ApplicationHelper before_action :require_non_empty_project before_action :assign_ref_vars before_action :authorize_download_code! def show @url = namespace_project_network_path(@project.namespace, @project, @ref, @options.merge(format: :json)) @commit_url = namespace_project_commit_path(@project.namespace, @project, 'ae45ca32').gsub("ae45ca32", "%s") respond_to do |format| format.html format.json do @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) end end end end ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/repositories_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/projects/repositories_cont0000644000175600017570000000104012672631600031260 0ustar pravipraviclass Projects::RepositoriesController < Projects::ApplicationController # Authorize before_action :require_non_empty_project, except: :create before_action :authorize_download_code! before_action :authorize_admin_project!, only: :create def create @project.create_repository redirect_to project_path(@project) end def archive render json: ArchiveRepositoryService.new(@project, params[:ref], params[:format]).execute rescue => ex logger.error("#{self.class.name}: #{ex}") return git_not_found! end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/autocomplete_controller.rb0000644000175600017570000000243012672631600031227 0ustar pravipraviclass AutocompleteController < ApplicationController skip_before_action :authenticate_user!, only: [:users] before_action :find_users, only: [:users] def users @users ||= User.none @users = @users.search(params[:search]) if params[:search].present? @users = @users.active @users = @users.reorder(:name) @users = @users.page(params[:page]).per(PER_PAGE) if params[:search].blank? # Include current user if available to filter by "Me" if params[:current_user] && current_user @users = [*@users, current_user].uniq end end render json: @users, only: [:name, :username, :id], methods: [:avatar_url] end def user @user = User.find(params[:id]) render json: @user, only: [:name, :username, :id], methods: [:avatar_url] end private def find_users @users = if params[:project_id].present? project = Project.find(params[:project_id]) return render_404 unless can?(current_user, :read_project, project) project.team.users elsif params[:group_id].present? group = Group.find(params[:group_id]) return render_404 unless can?(current_user, :read_group, group) group.users elsif current_user User.all else User.none end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/0000755000175600017570000000000012672631600025562 5ustar pravipravi././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/two_factor_auths_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/two_factor_auths_0000644000175600017570000000375312672631600031227 0ustar pravipraviclass Profiles::TwoFactorAuthsController < Profiles::ApplicationController skip_before_action :check_2fa_requirement def new unless current_user.otp_secret current_user.otp_secret = User.generate_otp_secret(32) end unless current_user.otp_grace_period_started_at && two_factor_grace_period current_user.otp_grace_period_started_at = Time.current end current_user.save! if current_user.changed? if two_factor_authentication_required? if two_factor_grace_period_expired? flash.now[:alert] = 'You must enable Two-factor Authentication for your account.' else grace_period_deadline = current_user.otp_grace_period_started_at + two_factor_grace_period.hours flash.now[:alert] = "You must enable Two-factor Authentication for your account before #{l(grace_period_deadline)}." end end @qr_code = build_qr_code end def create if current_user.validate_and_consume_otp!(params[:pin_code]) current_user.two_factor_enabled = true @codes = current_user.generate_otp_backup_codes! current_user.save! render 'create' else @error = 'Invalid pin code' @qr_code = build_qr_code render 'new' end end def codes @codes = current_user.generate_otp_backup_codes! current_user.save! end def destroy current_user.disable_two_factor! redirect_to profile_account_path end def skip if two_factor_grace_period_expired? redirect_to new_profile_two_factor_auth_path, alert: 'Cannot skip two factor authentication setup' else session[:skip_tfa] = current_user.otp_grace_period_started_at + two_factor_grace_period.hours redirect_to root_path end end private def build_qr_code issuer = "#{issuer_host} | #{current_user.email}" uri = current_user.otp_provisioning_uri(current_user.email, issuer: issuer) RQRCode::render_qrcode(uri, :svg, level: :m, unit: 3) end def issuer_host Gitlab.config.gitlab.host end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/avatars_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/avatars_controlle0000644000175600017570000000033112672631600031224 0ustar pravipraviclass Profiles::AvatarsController < Profiles::ApplicationController def destroy @user = current_user @user.remove_avatar! @user.save @user.reset_events_cache redirect_to profile_path end end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/passwords_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/passwords_control0000644000175600017570000000420312672631600031271 0ustar pravipraviclass Profiles::PasswordsController < Profiles::ApplicationController skip_before_action :check_password_expiration, only: [:new, :create] before_action :set_user before_action :authorize_change_password! layout :determine_layout def new end def create unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) redirect_to new_profile_password_path, alert: 'You must provide a valid current password' return end new_password = user_params[:password] new_password_confirmation = user_params[:password_confirmation] result = @user.update_attributes( password: new_password, password_confirmation: new_password_confirmation, password_automatically_set: false ) if result @user.update_attributes(password_expires_at: nil) redirect_to root_path, notice: 'Password successfully changed' else render :new end end def edit end def update password_attributes = user_params.select do |key, value| %w(password password_confirmation).include?(key.to_s) end password_attributes[:password_automatically_set] = false unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) redirect_to edit_profile_password_path, alert: 'You must provide a valid current password' return end if @user.update_attributes(password_attributes) flash[:notice] = "Password was successfully updated. Please login with it" redirect_to new_user_session_path else render 'edit' end end def reset current_user.send_reset_password_instructions redirect_to edit_profile_password_path, notice: 'We sent you an email with reset password instructions' end private def set_user @user = current_user end def determine_layout if [:new, :create].include?(action_name.to_sym) 'application' else 'profile' end end def authorize_change_password! return render_404 if @user.ldap_user? end def user_params params.require(:user).permit(:current_password, :password, :password_confirmation) end end ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/notifications_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/notifications_con0000644000175600017570000000242612672631600031221 0ustar pravipraviclass Profiles::NotificationsController < Profiles::ApplicationController def show @user = current_user @notification = current_user.notification @project_members = current_user.project_members @group_members = current_user.group_members end def update type = params[:notification_type] @saved = if type == 'global' current_user.update_attributes(user_params) elsif type == 'group' group_member = current_user.group_members.find(params[:notification_id]) group_member.notification_level = params[:notification_level] group_member.save else project_member = current_user.project_members.find(params[:notification_id]) project_member.notification_level = params[:notification_level] project_member.save end respond_to do |format| format.html do if @saved flash[:notice] = "Notification settings saved" else flash[:alert] = "Failed to save new settings" end redirect_back_or_default(default: profile_notifications_path) end format.js end end def user_params params.require(:user).permit(:notification_email, :notification_level) end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/application_contr0000644000175600017570000000012512672631600031213 0ustar pravipraviclass Profiles::ApplicationController < ApplicationController layout 'profile' end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/keys_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/keys_controller.r0000644000175600017570000000234712672631600031171 0ustar pravipraviclass Profiles::KeysController < Profiles::ApplicationController skip_before_action :authenticate_user!, only: [:get_keys] def index @keys = current_user.keys end def show @key = current_user.keys.find(params[:id]) end def new @key = current_user.keys.new end def create @key = current_user.keys.new(key_params) if @key.save redirect_to profile_key_path(@key) else render 'new' end end def destroy @key = current_user.keys.find(params[:id]) @key.destroy respond_to do |format| format.html { redirect_to profile_keys_url } format.js { render nothing: true } end end # Get all keys of a user(params[:username]) in a text format # Helpful for sysadmins to put in respective servers def get_keys if params[:username].present? begin user = User.find_by_username(params[:username]) if user.present? render text: user.all_ssh_keys.join("\n"), content_type: "text/plain" else render_404 and return end rescue => e render text: e.message end else render_404 and return end end private def key_params params.require(:key).permit(:title, :key) end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/emails_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/emails_controller0000644000175600017570000000135412672631600031225 0ustar pravipraviclass Profiles::EmailsController < Profiles::ApplicationController def index @primary = current_user.email @emails = current_user.emails end def create @email = current_user.emails.new(email_params) if @email.save NotificationService.new.new_email(@email) else flash[:alert] = @email.errors.full_messages.first end redirect_to profile_emails_url end def destroy @email = current_user.emails.find(params[:id]) @email.destroy current_user.update_secondary_emails! respond_to do |format| format.html { redirect_to profile_emails_url } format.js { render nothing: true } end end private def email_params params.require(:email).permit(:email) end end ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/preferences_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/preferences_contr0000644000175600017570000000145712672631600031222 0ustar pravipraviclass Profiles::PreferencesController < Profiles::ApplicationController before_action :user def show end def update begin if @user.update_attributes(preferences_params) flash[:notice] = 'Preferences saved.' else flash[:alert] = 'Failed to save preferences.' end rescue ArgumentError => e # Raised when `dashboard` is given an invalid value. flash[:alert] = "Failed to save preferences (#{e.message})." end respond_to do |format| format.html { redirect_to profile_preferences_path } format.js end end private def user @user = current_user end def preferences_params params.require(:user).permit( :color_scheme_id, :layout, :dashboard, :project_view, :theme_id ) end end ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/accounts_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles/accounts_controll0000644000175600017570000000041512672631600031240 0ustar pravipraviclass Profiles::AccountsController < Profiles::ApplicationController def show @user = current_user end def unlink provider = params[:provider] current_user.identities.find_by(provider: provider).destroy redirect_to profile_account_path end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/abuse_reports_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/abuse_reports_controller.r0000644000175600017570000000123212672631600031240 0ustar pravipraviclass AbuseReportsController < ApplicationController def new @abuse_report = AbuseReport.new @abuse_report.user_id = params[:user_id] @ref_url = params.fetch(:ref_url, '') end def create @abuse_report = AbuseReport.new(report_params) @abuse_report.reporter = current_user if @abuse_report.save @abuse_report.notify message = "Thank you for your report. A GitLab administrator will look into it shortly." redirect_to @abuse_report.user, notice: message else render :new end end private def report_params params.require(:abuse_report).permit(%i( message user_id )) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/profiles_controller.rb0000644000175600017570000000374012672631600030356 0ustar pravipraviclass ProfilesController < Profiles::ApplicationController include ActionView::Helpers::SanitizeHelper before_action :user before_action :authorize_change_username!, only: :update_username skip_before_action :require_email, only: [:show, :update] def show end def applications @applications = current_user.oauth_applications @authorized_tokens = current_user.oauth_authorized_tokens @authorized_anonymous_tokens = @authorized_tokens.reject(&:application) @authorized_apps = @authorized_tokens.map(&:application).uniq - [nil] end def update user_params.except!(:email) if @user.ldap_user? if @user.update_attributes(user_params) flash[:notice] = "Profile was successfully updated" else messages = @user.errors.full_messages.uniq.join('. ') flash[:alert] = "Failed to update profile. #{messages}" end respond_to do |format| format.html { redirect_back_or_default(default: { action: 'show' }) } end end def reset_private_token if current_user.reset_authentication_token! flash[:notice] = "Token was successfully updated" end redirect_to profile_account_path end def audit_log @events = AuditEvent.where(entity_type: "User", entity_id: current_user.id). order("created_at DESC"). page(params[:page]). per(PER_PAGE) end def update_username @user.update_attributes(username: user_params[:username]) respond_to do |format| format.js end end private def user @user = current_user end def authorize_change_username! return render_404 unless @user.can_change_username? end def user_params params.require(:user).permit( :avatar, :bio, :email, :hide_no_password, :hide_no_ssh_key, :hide_project_limit, :linkedin, :location, :name, :password, :password_confirmation, :public_email, :skype, :twitter, :username, :website_url ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sessions_controller.rb0000644000175600017570000000704412672631600030402 0ustar pravipraviclass SessionsController < Devise::SessionsController include AuthenticatesWithTwoFactor include Recaptcha::ClientHelper skip_before_action :check_2fa_requirement, only: [:destroy] prepend_before_action :authenticate_with_two_factor, only: [:create] prepend_before_action :store_redirect_path, only: [:new] before_action :auto_sign_in_with_provider, only: [:new] before_action :load_recaptcha def new if Gitlab.config.ldap.enabled @ldap_servers = Gitlab::LDAP::Config.servers else @ldap_servers = [] end super end def create super do |resource| # User has successfully signed in, so clear any unused reset token if resource.reset_password_token.present? resource.update_attributes(reset_password_token: nil, reset_password_sent_at: nil) end authenticated_with = user_params[:otp_attempt] ? "two-factor" : "standard" log_audit_event(current_user, with: authenticated_with) end end private def user_params params.require(:user).permit(:login, :password, :remember_me, :otp_attempt) end def find_user if user_params[:login] User.by_login(user_params[:login]) elsif user_params[:otp_attempt] && session[:otp_user_id] User.find(session[:otp_user_id]) end end def store_redirect_path redirect_path = if request.referer.present? && (params['redirect_to_referer'] == 'yes') referer_uri = URI(request.referer) if referer_uri.host == Gitlab.config.gitlab.host referer_uri.path else request.fullpath end else request.fullpath end # Prevent a 'you are already signed in' message directly after signing: # we should never redirect to '/users/sign_in' after signing in successfully. unless redirect_path == new_user_session_path store_location_for(:redirect, redirect_path) end end def authenticate_with_two_factor user = self.resource = find_user return unless user && user.two_factor_enabled? if user_params[:otp_attempt].present? && session[:otp_user_id] if valid_otp_attempt?(user) # Remove any lingering user data from login session.delete(:otp_user_id) sign_in(user) and return else flash.now[:alert] = 'Invalid two-factor code.' render :two_factor and return end else if user && user.valid_password?(user_params[:password]) prompt_for_two_factor(user) end end end def auto_sign_in_with_provider provider = Gitlab.config.omniauth.auto_sign_in_with_provider return unless provider.present? # Auto sign in with an Omniauth provider only if the standard "you need to sign-in" alert is # registered or no alert at all. In case of another alert (such as a blocked user), it is safer # to do nothing to prevent redirection loops with certain Omniauth providers. return unless flash[:alert].blank? || flash[:alert] == I18n.t('devise.failure.unauthenticated') # Prevent alert from popping up on the first page shown after authentication. flash[:alert] = nil redirect_to user_omniauth_authorize_path(provider.to_sym) end def valid_otp_attempt?(user) user.validate_and_consume_otp!(user_params[:otp_attempt]) || user.invalidate_otp_backup_code!(user_params[:otp_attempt]) end def log_audit_event(user, options = {}) AuditEventService.new(user, user, options). for_authentication.security_event end def load_recaptcha Gitlab::Recaptcha.load_configurations! end end ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/confirmations_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/confirmations_controller.r0000644000175600017570000000061512672631600031242 0ustar pravipraviclass ConfirmationsController < Devise::ConfirmationsController protected def after_confirmation_path_for(resource_name, resource) if signed_in?(resource_name) after_sign_in_path_for(resource) else sign_in(resource) if signed_in?(resource_name) after_sign_in_path_for(resource) else new_session_path(resource_name) end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/namespaces_controller.rb0000644000175600017570000000075112672631600030651 0ustar pravipraviclass NamespacesController < ApplicationController skip_before_action :authenticate_user! def show namespace = Namespace.find_by(path: params[:id]) if namespace if namespace.is_a?(Group) group = namespace else user = namespace.owner end end if user redirect_to user_path(user) elsif group redirect_to group_path(group) elsif current_user.nil? authenticate_user! else render_404 end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/0000755000175600017570000000000012672631600025551 5ustar pravipravi././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/merge_requests_action.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/merge_requests_ac0000644000175600017570000000054212672631600031172 0ustar pravipravimodule MergeRequestsAction extend ActiveSupport::Concern def merge_requests @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(ApplicationController::PER_PAGE) @merge_requests = @merge_requests.preload(:author, :target_project) @label = @issuable_finder.labels.first end end ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/authenticates_with_two_factor.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/authenticates_wit0000644000175600017570000000163012672631600031220 0ustar pravipravi# == AuthenticatesWithTwoFactor # # Controller concern to handle two-factor authentication # # Upon inclusion, skips `require_no_authentication` on `:create`. module AuthenticatesWithTwoFactor extend ActiveSupport::Concern included do # This action comes from DeviseController, but because we call `sign_in` # manually, not skipping this action would cause a "You are already signed # in." error message to be shown upon successful login. skip_before_action :require_no_authentication, only: [:create] end # Store the user's ID in the session for later retrieval and render the # two factor code prompt # # The user must have been authenticated with a valid login and password # before calling this method! # # user - User record # # Returns nil def prompt_for_two_factor(user) session[:otp_user_id] = user.id render 'devise/sessions/two_factor' and return end end ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/global_milestones.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/global_milestones0000644000175600017570000000125112672631600031175 0ustar pravipravimodule GlobalMilestones extend ActiveSupport::Concern def milestones epoch = DateTime.parse('1970-01-01') @milestones = MilestonesFinder.new.execute(@projects, params) @milestones = GlobalMilestone.build_collection(@milestones) @milestones = @milestones.sort_by { |x| x.due_date.nil? ? epoch : x.due_date } @milestones = Kaminari.paginate_array(@milestones).page(params[:page]).per(ApplicationController::PER_PAGE) end def milestone milestones = Milestone.of_projects(@projects).where(title: params[:title]) if milestones.present? @milestone = GlobalMilestone.new(params[:title], milestones) else render_404 end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/creates_commit.rb0000644000175600017570000000705412672631600031102 0ustar pravipravimodule CreatesCommit extend ActiveSupport::Concern def create_commit(service, success_path:, failure_path:, failure_view: nil, success_notice: nil) set_commit_variables commit_params = @commit_params.merge( source_project: @project, source_branch: @ref, target_branch: @target_branch ) result = service.new(@tree_edit_project, current_user, commit_params).execute if result[:status] == :success update_flash_notice(success_notice) respond_to do |format| format.html { redirect_to final_success_path(success_path) } format.json { render json: { message: "success", filePath: final_success_path(success_path) } } end else flash[:alert] = result[:message] respond_to do |format| format.html do if failure_view render failure_view else redirect_to failure_path end end format.json { render json: { message: "failed", filePath: failure_path } } end end end def authorize_edit_tree! return if can_collaborate_with_project? access_denied! end private def update_flash_notice(success_notice) flash[:notice] = success_notice || "Your changes have been successfully committed." if create_merge_request? if merge_request_exists? flash[:notice] = nil else target = different_project? ? "project" : "branch" flash[:notice] << " You can now submit a merge request to get this change into the original #{target}." end end end def final_success_path(success_path) return success_path unless create_merge_request? merge_request_exists? ? existing_merge_request_path : new_merge_request_path end def new_merge_request_path new_namespace_project_merge_request_path( @mr_source_project.namespace, @mr_source_project, merge_request: { source_project_id: @mr_source_project.id, target_project_id: @mr_target_project.id, source_branch: @mr_source_branch, target_branch: @mr_target_branch } ) end def existing_merge_request_path namespace_project_merge_request_path(@mr_target_project.namespace, @mr_target_project, @merge_request) end def merge_request_exists? return @merge_request if defined?(@merge_request) @merge_request = @mr_target_project.merge_requests.opened.find_by( source_branch: @mr_source_branch, target_branch: @mr_target_branch ) end def different_project? @mr_source_project != @mr_target_project end def different_branch? @mr_source_branch != @mr_target_branch || different_project? end def create_merge_request? params[:create_merge_request].present? && different_branch? end def set_commit_variables @mr_source_branch ||= @target_branch if can?(current_user, :push_code, @project) # Edit file in this project @tree_edit_project = @project @mr_source_project = @project if @project.forked? # Merge request from this project to fork origin @mr_target_project = @project.forked_from_project @mr_target_branch = @mr_target_project.repository.root_ref else # Merge request to this project @mr_target_project = @project @mr_target_branch ||= @ref end else # Edit file in fork @tree_edit_project = current_user.fork_of(@project) # Merge request from fork to this project @mr_source_project = @tree_edit_project @mr_target_project = @project @mr_target_branch ||= @ref end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/concerns/issues_action.rb0000644000175600017570000000057512672631600030755 0ustar pravipravimodule IssuesAction extend ActiveSupport::Concern def issues @issues = get_issues_collection @issues = @issues.page(params[:page]).per(ApplicationController::PER_PAGE) @issues = @issues.preload(:author, :project) @label = @issuable_finder.labels.first respond_to do |format| format.html format.atom { render layout: false } end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/0000755000175600017570000000000012672631600025415 5ustar pravipravi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/snippets_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/snippets_controlle0000644000175600017570000000033412672631600031266 0ustar pravipraviclass Explore::SnippetsController < Explore::ApplicationController def index @snippets = SnippetsFinder.new.execute(current_user, filter: :all) @snippets = @snippets.page(params[:page]).per(PER_PAGE) end end ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/groups_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/groups_controller.0000644000175600017570000000045512672631600031204 0ustar pravipraviclass Explore::GroupsController < Explore::ApplicationController def index @groups = Group.order_id_desc @groups = @groups.search(params[:search]) if params[:search].present? @groups = @groups.sort(@sort = params[:sort]) @groups = @groups.page(params[:page]).per(PER_PAGE) end end ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/projects_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/projects_controlle0000644000175600017570000000363512672631600031261 0ustar pravipraviclass Explore::ProjectsController < Explore::ApplicationController def index @projects = ProjectsFinder.new.execute(current_user) @tags = @projects.tags_on(:tags) @projects = @projects.tagged_with(params[:tag]) if params[:tag].present? @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present? @projects = @projects.non_archived @projects = @projects.search(params[:search]) if params[:search].present? @projects = @projects.search(params[:filter_projects]) if params[:filter_projects].present? @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.includes(:namespace).page(params[:page]).per(PER_PAGE) respond_to do |format| format.html format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end end end def trending @projects = TrendingProjectsFinder.new.execute(current_user) @projects = @projects.non_archived @projects = @projects.search(params[:filter_projects]) if params[:filter_projects].present? @projects = @projects.page(params[:page]).per(PER_PAGE) respond_to do |format| format.html format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end end end def starred @projects = ProjectsFinder.new.execute(current_user) @projects = @projects.search(params[:filter_projects]) if params[:filter_projects].present? @projects = @projects.reorder('star_count DESC') @projects = @projects.page(params[:page]).per(PER_PAGE) respond_to do |format| format.html format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) } end end end end ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/application_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/explore/application_contro0000644000175600017570000000021712672631600031227 0ustar pravipraviclass Explore::ApplicationController < ApplicationController skip_before_action :authenticate_user!, :reject_blocked layout 'explore' end ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sent_notifications_controller.rbgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/sent_notifications_control0000644000175600017570000000132012672631600031320 0ustar pravipraviclass SentNotificationsController < ApplicationController skip_before_action :authenticate_user! def unsubscribe @sent_notification = SentNotification.for(params[:id]) return render_404 unless @sent_notification && @sent_notification.unsubscribable? noteable = @sent_notification.noteable noteable.unsubscribe(@sent_notification.recipient) flash[:notice] = "You have been unsubscribed from this thread." if current_user case noteable when Issue redirect_to issue_path(noteable) when MergeRequest redirect_to merge_request_path(noteable) else redirect_to root_path end else redirect_to new_user_session_path end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/controllers/dashboard_controller.rb0000644000175600017570000000165012672631600030460 0ustar pravipraviclass DashboardController < Dashboard::ApplicationController include IssuesAction include MergeRequestsAction before_action :event_filter, only: :activity before_action :projects, only: [:issues, :merge_requests] respond_to :html def activity @last_push = current_user.recent_push respond_to do |format| format.html format.json do load_events pager_json("events/_events", @events.count) end end end protected def load_events projects = if params[:filter] == "starred" current_user.starred_projects else current_user.authorized_projects end @events = Event.in_projects(projects) @events = @event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end def projects @projects ||= current_user.authorized_projects.sorted_by_activity.non_archived end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/0000755000175600017570000000000012672631600023033 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/commits_helper.rb0000644000175600017570000001540612672631600026400 0ustar pravipravi# encoding: utf-8 module CommitsHelper # Returns a link to the commit author. If the author has a matching user and # is a member of the current @project it will link to the team member page. # Otherwise it will link to the author email as specified in the commit. # # options: # avatar: true will prepend the avatar image # size: size of the avatar image in px def commit_author_link(commit, options = {}) commit_person_link(commit, options.merge(source: :author)) end # Just like #author_link but for the committer. def commit_committer_link(commit, options = {}) commit_person_link(commit, options.merge(source: :committer)) end def image_diff_class(diff) if diff.deleted_file "deleted" elsif diff.new_file "added" else nil end end def commit_to_html(commit, project, inline = true) template = inline ? "inline_commit" : "commit" escape_javascript(render "projects/commits/#{template}", commit: commit, project: project) unless commit.nil? end # Breadcrumb links for a Project and, if applicable, a tree path def commits_breadcrumbs return unless @project && @ref # Add the root project link and the arrow icon crumbs = content_tag(:li) do link_to( @project.path, namespace_project_commits_path(@project.namespace, @project, @ref) ) end if @path parts = @path.split('/') parts.each_with_index do |part, i| crumbs << content_tag(:li) do # The text is just the individual part, but the link needs all the parts before it link_to( part, namespace_project_commits_path( @project.namespace, @project, tree_join(@ref, parts[0..i].join('/')) ) ) end end end crumbs.html_safe end # Return Project default branch, if it present in array # Else - first branch in array (mb last actual branch) def commit_default_branch(project, branches) branches.include?(project.default_branch) ? branches.delete(project.default_branch) : branches.pop end # Returns the sorted alphabetically links to branches, separated by a comma def commit_branches_links(project, branches) branches.sort.map do |branch| link_to( namespace_project_tree_path(project.namespace, project, branch) ) do content_tag :span, class: 'label label-gray' do icon('code-fork') + ' ' + branch end end end.join(" ").html_safe end # Returns the sorted links to tags, separated by a comma def commit_tags_links(project, tags) sorted = VersionSorter.rsort(tags) sorted.map do |tag| link_to( namespace_project_commits_path(project.namespace, project, project.repository.find_tag(tag).name) ) do content_tag :span, class: 'label label-gray' do icon('tag') + ' ' + tag end end end.join(" ").html_safe end def link_to_browse_code(project, commit) if current_controller?(:projects, :commits) if @repo.blob_at(commit.id, @path) return link_to( "Browse File »", namespace_project_blob_path(project.namespace, project, tree_join(commit.id, @path)), class: "pull-right" ) elsif @path.present? return link_to( "Browse Directory »", namespace_project_tree_path(project.namespace, project, tree_join(commit.id, @path)), class: "pull-right" ) end end link_to( "Browse Files »", namespace_project_tree_path(project.namespace, project, commit), class: "pull-right" ) end def revert_commit_link(commit, continue_to_path, btn_class: nil) return unless current_user tooltip = "Revert this #{revert_commit_type(commit)} in a new merge request" if can_collaborate_with_project? content_tag :span, 'data-toggle' => 'modal', 'data-target' => '#modal-revert-commit' do link_to 'Revert', '#modal-revert-commit', 'data-toggle' => 'tooltip', 'data-container' => 'body', title: tooltip, class: "btn btn-default btn-grouped btn-#{btn_class}" end elsif can?(current_user, :fork_project, @project) continue_params = { to: continue_to_path, notice: edit_in_new_fork_notice + ' Try to revert this commit again.', notice_now: edit_in_new_fork_notice_now } fork_path = namespace_project_forks_path(@project.namespace, @project, namespace_key: current_user.namespace.id, continue: continue_params) link_to 'Revert', fork_path, class: 'btn btn-grouped btn-close', method: :post, 'data-toggle' => 'tooltip', 'data-container' => 'body', title: tooltip end end def revert_commit_type(commit) if commit.merged_merge_request 'merge request' else 'commit' end end protected # Private: Returns a link to a person. If the person has a matching user and # is a member of the current @project it will link to the team member page. # Otherwise it will link to the person email as specified in the commit. # # options: # source: one of :author or :committer # avatar: true will prepend the avatar image # size: size of the avatar image in px def commit_person_link(commit, options = {}) user = commit.send(options[:source]) source_name = clean(commit.send "#{options[:source]}_name".to_sym) source_email = clean(commit.send "#{options[:source]}_email".to_sym) person_name = user.try(:name) || source_name person_email = user.try(:email) || source_email text = if options[:avatar] avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") %Q{#{avatar} #{person_name}} else person_name end options = { class: "commit-#{options[:source]}-link has_tooltip", data: { 'original-title'.to_sym => sanitize(source_email) } } if user.nil? mail_to(source_email, text.html_safe, options) else link_to(text.html_safe, user_path(user), options) end end def view_file_btn(commit_sha, diff, project) link_to( namespace_project_blob_path(project.namespace, project, tree_join(commit_sha, diff.new_path)), class: 'btn view-file js-view-file' ) do raw('View file @') + content_tag(:span, commit_sha[0..6], class: 'commit-short-id') end end def truncate_sha(sha) Commit.truncate_sha(sha) end def clean(string) Sanitize.clean(string, remove_contents: true) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/selects_helper.rb0000644000175600017570000000347412672631600026371 0ustar pravipravimodule SelectsHelper def users_select_tag(id, opts = {}) css_class = "ajax-users-select " css_class << "multiselect " if opts[:multiple] css_class << (opts[:class] || '') value = opts[:selected] || '' placeholder = opts[:placeholder] || 'Search for a user' null_user = opts[:null_user] || false any_user = opts[:any_user] || false email_user = opts[:email_user] || false first_user = opts[:first_user] && current_user ? current_user.username : false current_user = opts[:current_user] || false project = opts[:project] || @project html = { class: css_class, data: { placeholder: placeholder, null_user: null_user, any_user: any_user, email_user: email_user, first_user: first_user, current_user: current_user } } unless opts[:scope] == :all if project html['data-project-id'] = project.id elsif @group html['data-group-id'] = @group.id end end hidden_field_tag(id, value, html) end def groups_select_tag(id, opts = {}) opts[:class] ||= '' opts[:class] << ' ajax-groups-select' select2_tag(id, opts) end def namespace_select_tag(id, opts = {}) opts[:class] ||= '' opts[:class] << ' ajax-namespace-select' select2_tag(id, opts) end def project_select_tag(id, opts = {}) opts[:class] ||= '' opts[:class] << ' ajax-project-select' unless opts.delete(:scope) == :all if @group opts['data-group-id'] = @group.id end end hidden_field_tag(id, opts[:selected], opts) end def select2_tag(id, opts = {}) css_class = '' css_class << 'multiselect ' if opts[:multiple] css_class << (opts[:class] || '') value = opts[:selected] || '' hidden_field_tag(id, value, class: css_class) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/diff_helper.rb0000644000175600017570000000711212672631600025630 0ustar pravipravimodule DiffHelper def mark_inline_diffs(old_line, new_line) old_diffs, new_diffs = Gitlab::Diff::InlineDiff.new(old_line, new_line).inline_diffs marked_old_line = Gitlab::Diff::InlineDiffMarker.new(old_line).mark(old_diffs) marked_new_line = Gitlab::Diff::InlineDiffMarker.new(new_line).mark(new_diffs) [marked_old_line, marked_new_line] end def diff_view params[:view] == 'parallel' ? 'parallel' : 'inline' end def allowed_diff_size if diff_hard_limit_enabled? Commit::DIFF_HARD_LIMIT_FILES else Commit::DIFF_SAFE_FILES end end def allowed_diff_lines if diff_hard_limit_enabled? Commit::DIFF_HARD_LIMIT_LINES else Commit::DIFF_SAFE_LINES end end def safe_diff_files(diffs, diff_refs) lines = 0 safe_files = [] diffs.first(allowed_diff_size).each do |diff| lines += diff.diff.lines.count break if lines > allowed_diff_lines safe_files << Gitlab::Diff::File.new(diff, diff_refs) end safe_files end def diff_hard_limit_enabled? # Enabling hard limit allows user to see more diff information if params[:force_show_diff].present? true else false end end def generate_line_code(file_path, line) Gitlab::Diff::LineCode.generate(file_path, line.new_pos, line.old_pos) end def unfold_bottom_class(bottom) (bottom) ? 'js-unfold-bottom' : '' end def unfold_class(unfold) (unfold) ? 'unfold js-unfold' : '' end def diff_line_content(line) if line.blank? "  ".html_safe else line end end def line_comments @line_comments ||= @line_notes.select(&:active?).sort_by(&:created_at).group_by(&:line_code) end def organize_comments(type_left, type_right, line_code_left, line_code_right) comments_left = comments_right = nil unless type_left.nil? && type_right == 'new' comments_left = line_comments[line_code_left] end unless type_left.nil? && type_right.nil? comments_right = line_comments[line_code_right] end [comments_left, comments_right] end def inline_diff_btn diff_btn('Inline', 'inline', diff_view == 'inline') end def parallel_diff_btn diff_btn('Side-by-side', 'parallel', diff_view == 'parallel') end def submodule_link(blob, ref, repository = @repository) tree, commit = submodule_links(blob, ref, repository) commit_id = if commit.nil? Commit.truncate_sha(blob.id) else link_to Commit.truncate_sha(blob.id), commit end [ content_tag(:span, link_to(truncate(blob.name, length: 40), tree)), '@', content_tag(:span, commit_id, class: 'monospace'), ].join(' ').html_safe end def commit_for_diff(diff) if diff.deleted_file @base_commit || @commit.parent || @commit else @commit end end def diff_file_html_data(project, diff_commit, diff_file) { blob_diff_path: namespace_project_blob_diff_path(project.namespace, project, tree_join(diff_commit.id, diff_file.file_path)) } end def editable_diff?(diff) !diff.deleted_file && @merge_request && @merge_request.source_project end private def diff_btn(title, name, selected) params_copy = params.dup params_copy[:view] = name # Always use HTML to handle case where JSON diff rendered this button params_copy.delete(:format) link_to url_for(params_copy), id: "#{name}-diff-btn", class: (selected ? 'btn active' : 'btn'), data: { view_type: name } do title end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/page_layout_helper.rb0000644000175600017570000000546212672631600027237 0ustar pravipravimodule PageLayoutHelper def page_title(*titles) @page_title ||= [] @page_title.push(*titles.compact) if titles.any? # Segments are seperated by middot @page_title.join(" \u00b7 ") end # Define or get a description for the current page # # description - String (default: nil) # # If this helper is called multiple times with an argument, only the last # description will be returned when called without an argument. Descriptions # have newlines replaced with spaces and all HTML tags are sanitized. # # Examples: # # page_description # => "GitLab Community Edition" # page_description("Foo") # page_description # => "Foo" # # page_description("Bar\nBaz") # page_description # => "Bar Baz" # # Returns an HTML-safe String. def page_description(description = nil) if description.present? @page_description = description.squish elsif @page_description.present? sanitize(@page_description, tags: []).truncate_words(30) end end def page_image default = image_url('gitlab_logo.png') subject = @project || @user || @group image = subject.avatar_url if subject.present? image || default end # Define or get attributes to be used as Twitter card metadata # # map - Hash of label => data pairs. Keys become labels, values become data # # Raises ArgumentError if given more than two attributes def page_card_attributes(map = {}) raise ArgumentError, 'cannot provide more than two attributes' if map.length > 2 @page_card_attributes ||= {} @page_card_attributes = map.reject { |_,v| v.blank? } if map.present? @page_card_attributes end def page_card_meta_tags tags = '' page_card_attributes.each_with_index do |pair, i| tags << tag(:meta, property: "twitter:label#{i + 1}", content: pair[0]) tags << tag(:meta, property: "twitter:data#{i + 1}", content: pair[1]) end tags.html_safe end def header_title(title = nil, title_url = nil) if title @header_title = title @header_title_url = title_url else @header_title_url ? link_to(@header_title, @header_title_url) : @header_title end end def sidebar(name = nil) if name @sidebar = name else @sidebar end end def fluid_layout(enabled = false) if @fluid_layout.nil? @fluid_layout = (current_user && current_user.layout == "fluid") || enabled else @fluid_layout end end def blank_container(enabled = false) if @blank_container.nil? @blank_container = enabled else @blank_container end end def container_class css_class = "container-fluid" unless fluid_layout css_class += " container-limited" end if blank_container css_class += " container-blank" end css_class end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/application_settings_helper.rb0000644000175600017570000000360312672631600031144 0ustar pravipravimodule ApplicationSettingsHelper def gravatar_enabled? current_application_settings.gravatar_enabled? end def twitter_sharing_enabled? current_application_settings.twitter_sharing_enabled? end def signup_enabled? current_application_settings.signup_enabled? end def signin_enabled? current_application_settings.signin_enabled? end def extra_sign_in_text current_application_settings.sign_in_text end def user_oauth_applications? current_application_settings.user_oauth_applications end def askimet_enabled? current_application_settings.akismet_enabled? end # Return a group of checkboxes that use Bootstrap's button plugin for a # toggle button effect. def restricted_level_checkboxes(help_block_id) Gitlab::VisibilityLevel.options.map do |name, level| checked = restricted_visibility_levels(true).include?(level) css_class = 'btn' css_class += ' active' if checked checkbox_name = 'application_setting[restricted_visibility_levels][]' label_tag(checkbox_name, class: css_class) do check_box_tag(checkbox_name, level, checked, autocomplete: 'off', 'aria-describedby' => help_block_id) + name end end end # Return a group of checkboxes that use Bootstrap's button plugin for a # toggle button effect. def import_sources_checkboxes(help_block_id) Gitlab::ImportSources.options.map do |name, source| checked = current_application_settings.import_sources.include?(source) css_class = 'btn' css_class += ' active' if checked checkbox_name = 'application_setting[import_sources][]' label_tag(checkbox_name, class: css_class) do check_box_tag(checkbox_name, source, checked, autocomplete: 'off', 'aria-describedby' => help_block_id) + name end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/application_helper.rb0000644000175600017570000001735412672631600027234 0ustar pravipravirequire 'digest/md5' require 'uri' module ApplicationHelper # Check if a particular controller is the current one # # args - One or more controller names to check # # Examples # # # On TreeController # current_controller?(:tree) # => true # current_controller?(:commits) # => false # current_controller?(:commits, :tree) # => true def current_controller?(*args) args.any? do |v| v.to_s.downcase == controller.controller_name || v.to_s.downcase == controller.controller_path end end # Check if a particular action is the current one # # args - One or more action names to check # # Examples # # # On Projects#new # current_action?(:new) # => true # current_action?(:create) # => false # current_action?(:new, :create) # => true def current_action?(*args) args.any? { |v| v.to_s.downcase == action_name } end def project_icon(project_id, options = {}) project = if project_id.is_a?(Project) project_id else Project.find_with_namespace(project_id) end if project.avatar_url image_tag project.avatar_url, options else # generated icon project_identicon(project, options) end end def project_identicon(project, options = {}) allowed_colors = { red: 'FFEBEE', purple: 'F3E5F5', indigo: 'E8EAF6', blue: 'E3F2FD', teal: 'E0F2F1', orange: 'FBE9E7', gray: 'EEEEEE' } options[:class] ||= '' options[:class] << ' identicon' bg_key = project.id % 7 style = "background-color: ##{allowed_colors.values[bg_key]}; color: #555" content_tag(:div, class: options[:class], style: style) do project.name[0, 1].upcase end end def avatar_icon(user_or_email = nil, size = nil, scale = 2) if user_or_email.is_a?(User) user = user_or_email else user = User.find_by(email: user_or_email.try(:downcase)) end if user user.avatar_url(size) || default_avatar else gravatar_icon(user_or_email, size, scale) end end def gravatar_icon(user_email = '', size = nil, scale = 2) GravatarService.new.execute(user_email, size, scale) || default_avatar end def default_avatar 'no_avatar.png' end def last_commit(project) if project.repo_exists? time_ago_with_tooltip(project.repository.commit.committed_date) else 'Never' end rescue 'Never' end def grouped_options_refs repository = @project.repository options = [ ['Branches', repository.branch_names], ['Tags', VersionSorter.rsort(repository.tag_names)] ] # If reference is commit id - we should add it to branch/tag selectbox if(@ref && !options.flatten.include?(@ref) && @ref =~ /\A[0-9a-zA-Z]{6,52}\z/) options << ['Commit', [@ref]] end grouped_options_for_select(options, @ref || @project.default_branch) end # Define whenever show last push event # with suggestion to create MR def show_last_push_widget?(event) # Skip if event is not about added or modified non-master branch return false unless event && event.last_push_to_non_root? && !event.rm_ref? project = event.project # Skip if project repo is empty or MR disabled return false unless project && !project.empty_repo? && project.merge_requests_enabled # Skip if user already created appropriate MR return false if project.merge_requests.where(source_branch: event.branch_name).opened.any? # Skip if user removed branch right after that return false unless project.repository.branch_names.include?(event.branch_name) true end def hexdigest(string) Digest::SHA1.hexdigest string end def simple_sanitize(str) sanitize(str, tags: %w(a span)) end def body_data_page path = controller.controller_path.split('/') namespace = path.first if path.second [namespace, controller.controller_name, controller.action_name].compact.join(':') end # shortcut for gitlab config def gitlab_config Gitlab.config.gitlab end # shortcut for gitlab extra config def extra_config Gitlab.config.extra end # Render a `time` element with Javascript-based relative date and tooltip # # time - Time object # placement - Tooltip placement String (default: "top") # html_class - Custom class for `time` element (default: "time_ago") # skip_js - When true, exclude the `script` tag (default: false) # # By default also includes a `script` element with Javascript necessary to # initialize the `timeago` jQuery extension. If this method is called many # times, for example rendering hundreds of commits, it's advisable to disable # this behavior using the `skip_js` argument and re-initializing `timeago` # manually once all of the elements have been rendered. # # A `js-timeago` class is always added to the element, even when a custom # `html_class` argument is provided. # # Returns an HTML-safe String def time_ago_with_tooltip(time, placement: 'top', html_class: 'time_ago', skip_js: false) element = content_tag :time, time.to_s, class: "#{html_class} js-timeago js-timeago-pending", datetime: time.to_time.getutc.iso8601, title: time.in_time_zone.to_s(:medium), data: { toggle: 'tooltip', placement: placement, container: 'body' } unless skip_js element << javascript_tag( "$('.js-timeago-pending').removeClass('js-timeago-pending').timeago()" ) end element end def render_markup(file_name, file_content) if gitlab_markdown?(file_name) Haml::Helpers.preserve(markdown(file_content)) elsif asciidoc?(file_name) asciidoc(file_content) elsif plain?(file_name) content_tag :pre, class: 'plain-readme' do file_content end else other_markup(file_name, file_content) end rescue RuntimeError simple_format(file_content) end def plain?(filename) Gitlab::MarkupHelper.plain?(filename) end def markup?(filename) Gitlab::MarkupHelper.markup?(filename) end def gitlab_markdown?(filename) Gitlab::MarkupHelper.gitlab_markdown?(filename) end def asciidoc?(filename) Gitlab::MarkupHelper.asciidoc?(filename) end def promo_host 'about.gitlab.com' end def promo_url 'https://' + promo_host end def page_filter_path(options = {}) without = options.delete(:without) exist_opts = { state: params[:state], scope: params[:scope], label_name: params[:label_name], milestone_title: params[:milestone_title], assignee_id: params[:assignee_id], author_id: params[:author_id], sort: params[:sort], } options = exist_opts.merge(options) if without.present? without.each do |key| options.delete(key) end end path = request.path path << "?#{options.to_param}" path end def outdated_browser? browser.ie? && browser.version.to_i < 10 end def path_to_key(key, admin = false) if admin admin_user_key_path(@user, key) else profile_key_path(key) end end def state_filters_text_for(entity, project) titles = { opened: "Open" } entity_title = titles[entity] || entity.to_s.humanize count = if project.nil? nil elsif current_controller?(:issues) project.issues.send(entity).count elsif current_controller?(:merge_requests) project.merge_requests.send(entity).count end html = content_tag :span, entity_title if count.present? html += " " html += content_tag :span, number_with_delimiter(count), class: 'badge' end html.html_safe end def truncate_first_line(message, length = 50) truncate(message.each_line.first.chomp, length: length) if message end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/groups_helper.rb0000644000175600017570000000204012672631600026232 0ustar pravipravimodule GroupsHelper def remove_user_from_group_message(group, member) if member.user "Are you sure you want to remove \"#{member.user.name}\" from \"#{group.name}\"?" else "Are you sure you want to revoke the invitation for \"#{member.invite_email}\" to join \"#{group.name}\"?" end end def leave_group_message(group) "Are you sure you want to leave \"#{group}\" group?" end def should_user_see_group_roles?(user, group) if user user.is_admin? || group.members.exists?(user_id: user.id) else false end end def group_icon(group) if group.is_a?(String) group = Group.find_by(path: group) end if group && group.avatar.present? group.avatar.url else 'no_group_avatar.png' end end def group_title(group, name = nil, url = nil) full_title = link_to(simple_sanitize(group.name), group_path(group)) full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name content_tag :span do full_title end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/gitlab_routing_helper.rb0000644000175600017570000000552212672631600027734 0ustar pravipravi# Shorter routing method for project and project items # Since update to rails 4.1.9 we are now allowed to use `/` in project routing # so we use nested routing for project resources which include project and # project namespace. To avoid writing long methods every time we define shortcuts for # some of routing. # # For example instead of this: # # namespace_project_merge_request_path(merge_request.project.namespace, merge_request.project, merge_request) # # We can simply use shortcut: # # merge_request_path(merge_request) # module GitlabRoutingHelper def project_path(project, *args) namespace_project_path(project.namespace, project, *args) end def project_files_path(project, *args) namespace_project_tree_path(project.namespace, project, @ref || project.repository.root_ref) end def project_commits_path(project, *args) namespace_project_commits_path(project.namespace, project, @ref || project.repository.root_ref) end def project_builds_path(project, *args) namespace_project_builds_path(project.namespace, project, *args) end def activity_project_path(project, *args) activity_namespace_project_path(project.namespace, project, *args) end def edit_project_path(project, *args) edit_namespace_project_path(project.namespace, project, *args) end def runners_path(project, *args) namespace_project_runners_path(project.namespace, project, *args) end def runner_path(runner, *args) namespace_project_runner_path(@project.namespace, @project, runner, *args) end def issue_path(entity, *args) namespace_project_issue_path(entity.project.namespace, entity.project, entity, *args) end def merge_request_path(entity, *args) namespace_project_merge_request_path(entity.project.namespace, entity.project, entity, *args) end def milestone_path(entity, *args) namespace_project_milestone_path(entity.project.namespace, entity.project, entity, *args) end def project_url(project, *args) namespace_project_url(project.namespace, project, *args) end def edit_project_url(project, *args) edit_namespace_project_url(project.namespace, project, *args) end def issue_url(entity, *args) namespace_project_issue_url(entity.project.namespace, entity.project, entity, *args) end def merge_request_url(entity, *args) namespace_project_merge_request_url(entity.project.namespace, entity.project, entity, *args) end def project_snippet_url(entity, *args) namespace_project_snippet_url(entity.project.namespace, entity.project, entity, *args) end def toggle_subscription_path(entity, *args) if entity.is_a?(Issue) toggle_subscription_namespace_project_issue_path(entity.project.namespace, entity.project, entity) else toggle_subscription_namespace_project_merge_request_path(entity.project.namespace, entity.project, entity) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/preferences_helper.rb0000644000175600017570000000266712672631600027233 0ustar pravipravi# Helper methods for per-User preferences module PreferencesHelper def layout_choices [ ['Fixed', :fixed], ['Fluid', :fluid] ] end # Maps `dashboard` values to more user-friendly option text DASHBOARD_CHOICES = { projects: 'Your Projects (default)', stars: 'Starred Projects', project_activity: "Your Projects' Activity", starred_project_activity: "Starred Projects' Activity" }.with_indifferent_access.freeze # Returns an Array usable by a select field for more user-friendly option text def dashboard_choices defined = User.dashboards if defined.size != DASHBOARD_CHOICES.size # Ensure that anyone adding new options updates this method too raise RuntimeError, "`User` defines #{defined.size} dashboard choices," + " but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}." else defined.map do |key, _| # Use `fetch` so `KeyError` gets raised when a key is missing [DASHBOARD_CHOICES.fetch(key), key] end end end def project_view_choices [ ['Readme (default)', :readme], ['Activity view', :activity], ['Files view', :files] ] end def user_application_theme Gitlab::Themes.for_user(current_user).css_class end def user_color_scheme Gitlab::ColorSchemes.for_user(current_user).css_class end def default_project_view current_user ? current_user.project_view : 'readme' end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/emails_helper.rb0000644000175600017570000000276512672631600026203 0ustar pravipravimodule EmailsHelper # Google Actions # https://developers.google.com/gmail/markup/reference/go-to-action def email_action(url) name = action_title(url) if name data = { "@context" => "http://schema.org", "@type" => "EmailMessage", "action" => { "@type" => "ViewAction", "name" => name, "url" => url, } } content_tag :script, type: 'application/ld+json' do data.to_json.html_safe end end end def action_title(url) return unless url ["merge_requests", "issues", "commit"].each do |action| if url.split("/").include?(action) return "View #{action.humanize.singularize}" end end nil end def color_email_diff(diffcontent) formatter = Rouge::Formatters::HTML.new(css_class: 'highlight', inline_theme: 'github') lexer = Rouge::Lexers::Diff raw formatter.format(lexer.lex(diffcontent)) end def password_reset_token_valid_time valid_hours = Devise.reset_password_within / 60 / 60 if valid_hours >= 24 unit = 'day' valid_length = (valid_hours / 24).floor else unit = 'hour' valid_length = valid_hours.floor end pluralize(valid_length, unit) end def reset_token_expire_message link_tag = link_to('request a new one', new_user_password_url(user_email: @user.email)) msg = "This link is valid for #{password_reset_token_valid_time}. " msg << "After it expires, you can #{link_tag}." end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/notes_helper.rb0000644000175600017570000000422212672631600026047 0ustar pravipravimodule NotesHelper # Helps to distinguish e.g. commit notes in mr notes list def note_for_main_target?(note) (@noteable.class.name == note.noteable_type && !note.for_diff_line?) end def note_target_fields(note) hidden_field_tag(:target_type, note.noteable.class.name.underscore) + hidden_field_tag(:target_id, note.noteable.id) end def note_editable?(note) note.editable? && can?(current_user, :admin_note, note) end def link_to_commit_diff_line_note(note) if note.for_commit_diff_line? link_to( "#{note.diff_file_name}:L#{note.diff_new_line}", namespace_project_commit_path(@project.namespace, @project, note.noteable, anchor: note.line_code) ) end end def noteable_json(noteable) { id: noteable.id, class: noteable.class.name, resources: noteable.class.table_name, project_id: noteable.project.id, }.to_json end def link_to_new_diff_note(line_code, line_type = nil) discussion_id = Note.build_discussion_id( @comments_target[:noteable_type], @comments_target[:noteable_id] || @comments_target[:commit_id], line_code ) data = { noteable_type: @comments_target[:noteable_type], noteable_id: @comments_target[:noteable_id], commit_id: @comments_target[:commit_id], line_code: line_code, discussion_id: discussion_id, line_type: line_type } button_tag(class: 'btn add-diff-note js-add-diff-note-button', data: data, title: 'Add a comment to this line') do icon('comment-o') end end def link_to_reply_diff(note, line_type = nil) return unless current_user data = { noteable_type: note.noteable_type, noteable_id: note.noteable_id, commit_id: note.commit_id, line_code: note.line_code, discussion_id: note.discussion_id, line_type: line_type } button_tag class: 'btn btn-nr reply-btn js-discussion-reply-button', data: data, title: 'Add a reply' do link_text = icon('comment') link_text << ' Reply' end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/appearances_helper.rb0000644000175600017570000000105512672631600027202 0ustar pravipravimodule AppearancesHelper def brand_title if brand_item && brand_item.title brand_item.title else 'GitLab Community Edition' end end def brand_image if brand_item.logo? image_tag brand_item.logo else nil end end def brand_text markdown(brand_item.description) end def brand_item @appearance ||= Appearance.first end def brand_header_logo if brand_item && brand_item.header_logo? image_tag brand_item.header_logo else render 'shared/logo.svg' end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/runners_helper.rb0000644000175600017570000000143012672631600026411 0ustar pravipravimodule RunnersHelper def runner_status_icon(runner) status = runner.status case status when :not_connected content_tag :i, nil, class: "fa fa-warning", title: "New runner. Has not connected yet" when :online, :offline, :paused content_tag :i, nil, class: "fa fa-circle runner-status-#{status}", title: "Runner is #{status}, last contact was #{time_ago_in_words(runner.contacted_at)} ago" end end def runner_link(runner) display_name = truncate(runner.display_name, length: 15) id = "\##{runner.id}" if current_user && current_user.admin link_to admin_runner_path(runner) do display_name + id end else display_name + id end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/snippets_helper.rb0000644000175600017570000000565012672631600026572 0ustar pravipravimodule SnippetsHelper def lifetime_select_options options = [ ['forever', nil], ['1 day', "#{Date.current + 1.day}"], ['1 week', "#{Date.current + 1.week}"], ['1 month', "#{Date.current + 1.month}"] ] options_for_select(options) end def reliable_snippet_path(snippet) if snippet.project_id? namespace_project_snippet_path(snippet.project.namespace, snippet.project, snippet) else snippet_path(snippet) end end # Get an array of line numbers surrounding a matching # line, bounded by min/max. # # @returns Array of line numbers def bounded_line_numbers(line, min, max, surrounding_lines) lower = line - surrounding_lines > min ? line - surrounding_lines : min upper = line + surrounding_lines < max ? line + surrounding_lines : max (lower..upper).to_a end # Returns a sorted set of lines to be included in a snippet preview. # This ensures matching adjacent lines do not display duplicated # surrounding code. # # @returns Array, unique and sorted. def matching_lines(lined_content, surrounding_lines, query) used_lines = [] lined_content.each_with_index do |line, line_number| used_lines.concat bounded_line_numbers( line_number, 0, lined_content.size, surrounding_lines ) if line.include?(query) end used_lines.uniq.sort end # 'Chunkify' entire snippet. Splits the snippet data into matching lines + # surrounding_lines() worth of unmatching lines. # # @returns a hash with {snippet_object, snippet_chunks:{data,start_line}} def chunk_snippet(snippet, query, surrounding_lines = 3) lined_content = snippet.content.split("\n") used_lines = matching_lines(lined_content, surrounding_lines, query) snippet_chunk = [] snippet_chunks = [] snippet_start_line = 0 last_line = -1 # Go through each used line, and add consecutive lines as a single chunk # to the snippet chunk array. used_lines.each do |line_number| if last_line < 0 # Start a new chunk. snippet_start_line = line_number snippet_chunk << lined_content[line_number] elsif last_line == line_number - 1 # Consecutive line, continue chunk. snippet_chunk << lined_content[line_number] else # Non-consecutive line, add chunk to chunk array. snippet_chunks << { data: snippet_chunk.join("\n"), start_line: snippet_start_line + 1 } # Start a new chunk. snippet_chunk = [lined_content[line_number]] snippet_start_line = line_number end last_line = line_number end # Add final chunk to chunk array snippet_chunks << { data: snippet_chunk.join("\n"), start_line: snippet_start_line + 1 } # Return snippet with chunk array { snippet_object: snippet, snippet_chunks: snippet_chunks } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/sorting_helper.rb0000644000175600017570000000415312672631600026407 0ustar pravipravimodule SortingHelper def sort_options_hash { sort_value_name => sort_title_name, sort_value_recently_updated => sort_title_recently_updated, sort_value_oldest_updated => sort_title_oldest_updated, sort_value_recently_created => sort_title_recently_created, sort_value_oldest_created => sort_title_oldest_created, sort_value_milestone_soon => sort_title_milestone_soon, sort_value_milestone_later => sort_title_milestone_later, sort_value_largest_repo => sort_title_largest_repo, sort_value_recently_signin => sort_title_recently_signin, sort_value_oldest_signin => sort_title_oldest_signin, sort_value_downvotes => sort_title_downvotes, sort_value_upvotes => sort_title_upvotes } end def sort_title_oldest_updated 'Oldest updated' end def sort_title_recently_updated 'Last updated' end def sort_title_oldest_created 'Oldest created' end def sort_title_recently_created 'Last created' end def sort_title_milestone_soon 'Milestone due soon' end def sort_title_milestone_later 'Milestone due later' end def sort_title_name 'Name' end def sort_title_largest_repo 'Largest repository' end def sort_title_recently_signin 'Recent sign in' end def sort_title_oldest_signin 'Oldest sign in' end def sort_title_downvotes 'Least popular' end def sort_title_upvotes 'Most popular' end def sort_value_oldest_updated 'updated_asc' end def sort_value_recently_updated 'updated_desc' end def sort_value_oldest_created 'id_asc' end def sort_value_recently_created 'id_desc' end def sort_value_milestone_soon 'milestone_due_asc' end def sort_value_milestone_later 'milestone_due_desc' end def sort_value_name 'name_asc' end def sort_value_largest_repo 'repository_size_desc' end def sort_value_recently_signin 'recent_sign_in' end def sort_value_oldest_signin 'oldest_sign_in' end def sort_value_downvotes 'downvotes_desc' end def sort_value_upvotes 'upvotes_desc' end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/tree_helper.rb0000644000175600017570000000711712672631600025664 0ustar pravipravimodule TreeHelper # Sorts a repository's tree so that folders are before files and renders # their corresponding partials # # contents - A Grit::Tree object for the current tree def render_tree(tree) # Render Folders before Files/Submodules folders, files, submodules = tree.trees, tree.blobs, tree.submodules tree = "" # Render folders if we have any tree << render(partial: 'projects/tree/tree_item', collection: folders, locals: { type: 'folder' }) if folders.present? # Render files if we have any tree << render(partial: 'projects/tree/blob_item', collection: files, locals: { type: 'file' }) if files.present? # Render submodules if we have any tree << render(partial: 'projects/tree/submodule_item', collection: submodules) if submodules.present? tree.html_safe end def render_readme(readme) render_markup(readme.name, readme.data) end # Return an image icon depending on the file type and mode # # type - String type of the tree item; either 'folder' or 'file' # mode - File unix mode # name - File name def tree_icon(type, mode, name) icon("#{file_type_icon_class(type, mode, name)} fw") end def tree_hex_class(content) "file_#{hexdigest(content.name)}" end # Simple shortcut to File.join def tree_join(*args) File.join(*args) end def on_top_of_branch?(project = @project, ref = @ref) project.repository.branch_names.include?(ref) end def can_edit_tree?(project = nil, ref = nil) project ||= @project ref ||= @ref return false unless on_top_of_branch?(project, ref) can_collaborate_with_project?(project) end def tree_edit_branch(project = @project, ref = @ref) return unless can_edit_tree?(project, ref) if can_push_branch?(project, ref) ref else project = tree_edit_project(project) project.repository.next_patch_branch end end def tree_edit_project(project = @project) if can?(current_user, :push_code, project) project elsif current_user && current_user.already_forked?(project) current_user.fork_of(project) end end def edit_in_new_fork_notice_now "You're not allowed to make changes to this project directly." + " A fork of this project is being created that you can make changes in, so you can submit a merge request." end def edit_in_new_fork_notice "You're not allowed to make changes to this project directly." + " A fork of this project has been created that you can make changes in, so you can submit a merge request." end def commit_in_fork_help "A new branch will be created in your fork and a new merge request will be started." end def tree_breadcrumbs(tree, max_links = 2) if @path.present? part_path = "" parts = @path.split('/') yield('..', nil) if parts.count > max_links parts.each do |part| part_path = File.join(part_path, part) unless part_path.empty? part_path = part if part_path.empty? next if parts.count > max_links && !parts.last(2).include?(part) yield(part, tree_join(@ref, part_path)) end end end def up_dir_path file = File.join(@path, "..") tree_join(@ref, file) end # returns the relative path of the first subdir that doesn't have only one directory descendant def flatten_tree(tree) subtree = Gitlab::Git::Tree.where(@repository, @commit.id, tree.path) if subtree.count == 1 && subtree.first.dir? return tree_join(tree.name, flatten_tree(subtree.first)) else return tree.name end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/gitlab_markdown_helper.rb0000644000175600017570000001517612672631600030075 0ustar pravipravirequire 'nokogiri' module GitlabMarkdownHelper # Use this in places where you would normally use link_to(gfm(...), ...). # # It solves a problem occurring with nested links (i.e. # "outer text gfm ref more outer text"). This will not be # interpreted as intended. Browsers will parse something like # "outer text gfm ref more outer text" (notice the last part is # not linked any more). link_to_gfm corrects that. It wraps all parts to # explicitly produce the correct linking behavior (i.e. # "outer text gfm ref more outer text"). def link_to_gfm(body, url, html_options = {}) return "" if body.blank? escaped_body = if body =~ /\A\ at the beginning of a line", "Make a horizontal line using three or more hyphens ---, asterisks ***, or underscores ___" ].freeze # Returns a random markdown tip for use as a textarea placeholder def random_markdown_tip MARKDOWN_TIPS.sample end private # Return +text+, truncated to +max_chars+ characters, excluding any HTML # tags. def truncate_visible(text, max_chars) doc = Nokogiri::HTML.fragment(text) content_length = 0 truncated = false doc.traverse do |node| if node.text? || node.content.empty? if truncated node.remove next end # Handle line breaks within a node if node.content.strip.lines.length > 1 node.content = "#{node.content.lines.first.chomp}..." truncated = true end num_remaining = max_chars - content_length if node.content.length > num_remaining node.content = node.content.truncate(num_remaining) truncated = true end content_length += node.content.length end truncated = truncate_if_block(node, truncated) end doc.to_html end # Used by #truncate_visible. If +node+ is the first block element, and the # text hasn't already been truncated, then append "..." to the node contents # and return true. Otherwise return false. def truncate_if_block(node, truncated) if node.element? && node.description.block? && !truncated node.inner_html = "#{node.inner_html}..." if node.next_sibling true else truncated end end # Returns the text necessary to reference `entity` across projects # # project - Project to reference # entity - Object that responds to `to_reference` # # Examples: # # cross_project_reference(project, project.issues.first) # # => 'namespace1/project1#123' # # cross_project_reference(project, project.merge_requests.first) # # => 'namespace1/project1!345' # # Returns a String def cross_project_reference(project, entity) if entity.respond_to?(:to_reference) "#{project.to_reference}#{entity.to_reference}" else '' end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/icons_helper.rb0000644000175600017570000000523212672631600026034 0ustar pravipravimodule IconsHelper include FontAwesome::Rails::IconHelper # Creates an icon tag given icon name(s) and possible icon modifiers. # # Right now this method simply delegates directly to `fa_icon` from the # font-awesome-rails gem, but should we ever use a different icon pack in the # future we won't have to change hundreds of method calls. def icon(names, options = {}) options.include?(:base) ? fa_stacked_icon(names, options) : fa_icon(names, options) end def spinner(text = nil, visible = false) css_class = 'loading' css_class << ' hide' unless visible content_tag :div, class: css_class do icon('spinner spin') + text end end def boolean_to_icon(value) if value icon('circle', class: 'cgreen') else icon('power-off', class: 'clgray') end end def visibility_level_icon(level, fw: true) name = case level when Gitlab::VisibilityLevel::PRIVATE 'lock' when Gitlab::VisibilityLevel::INTERNAL 'shield' else # Gitlab::VisibilityLevel::PUBLIC 'globe' end name << " fw" if fw icon(name) end def file_type_icon_class(type, mode, name) if type == 'folder' icon_class = 'folder' elsif mode == '120000' icon_class = 'share' else # Guess which icon to choose based on file extension. # If you think a file extension is missing, feel free to add it on PR case File.extname(name).downcase when '.pdf' icon_class = 'file-pdf-o' when '.jpg', '.jpeg', '.jif', '.jfif', '.jp2', '.jpx', '.j2k', '.j2c', '.png', '.gif', '.tif', '.tiff', '.svg', '.ico', '.bmp' icon_class = 'file-image-o' when '.zip', '.zipx', '.tar', '.gz', '.bz', '.bzip', '.xz', '.rar', '.7z' icon_class = 'file-archive-o' when '.mp3', '.wma', '.ogg', '.oga', '.wav', '.flac', '.aac' icon_class = 'file-audio-o' when '.mp4', '.m4p', '.m4v', '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv', '.mpg', '.mpeg', '.m2v', '.avi', '.mkv', '.flv', '.ogv', '.mov', '.3gp', '.3g2' icon_class = 'file-video-o' when '.doc', '.dot', '.docx', '.docm', '.dotx', '.dotm', '.docb' icon_class = 'file-word-o' when '.xls', '.xlt', '.xlm', '.xlsx', '.xlsm', '.xltx', '.xltm', '.xlsb', '.xla', '.xlam', '.xll', '.xlw' icon_class = 'file-excel-o' when '.ppt', '.pot', '.pps', '.pptx', '.pptm', '.potx', '.potm', '.ppam', '.ppsx', '.ppsm', '.sldx', '.sldm' icon_class = 'file-powerpoint-o' else icon_class = 'file-text-o' end end icon_class end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/events_helper.rb0000644000175600017570000001500412672631600026223 0ustar pravipravimodule EventsHelper def link_to_author(event) author = event.author if author link_to author.name, user_path(author.username) else event.author_name end end def event_action_name(event) target = if event.target_type if event.note? event.note_target_type else event.target_type.titleize.downcase end else 'project' end [event.action_name, target].join(" ") end def event_filter_link(key, tooltip) key = key.to_s active = 'active' if @event_filter.active?(key) link_opts = { class: "event-filter-link", id: "#{key}_event_filter", title: "Filter by #{tooltip.downcase}", } content_tag :li, class: active do link_to request.path, link_opts do content_tag(:span, ' ' + tooltip) end end end def icon_for_event { EventFilter.push => 'upload', EventFilter.merged => 'check-square-o', EventFilter.comments => 'comments', EventFilter.team => 'user', } end def event_preposition(event) if event.push? || event.commented? || event.target "at" elsif event.milestone? "in" end end def event_feed_title(event) words = [] words << event.author_name words << event_action_name(event) if event.push? words << event.ref_type words << event.ref_name words << "at" elsif event.commented? if event.note_commit? words << event.note_short_commit_id else words << "##{truncate event.note_target_iid}" end words << "at" elsif event.milestone? words << "##{event.target_iid}" if event.target_iid words << "in" elsif event.target words << "##{event.target_iid}:" words << event.target.title if event.target.respond_to?(:title) words << "at" end words << event.project_name words.join(" ") end def event_feed_url(event) if event.issue? namespace_project_issue_url(event.project.namespace, event.project, event.issue) elsif event.merge_request? namespace_project_merge_request_url(event.project.namespace, event.project, event.merge_request) elsif event.note? && event.note_commit? namespace_project_commit_url(event.project.namespace, event.project, event.note_target) elsif event.note? if event.note_target if event.note_commit? namespace_project_commit_path(event.project.namespace, event.project, event.note_commit_id, anchor: dom_id(event.target)) elsif event.note_project_snippet? namespace_project_snippet_path(event.project.namespace, event.project, event.note_target) else event_note_target_path(event) end end elsif event.push? push_event_feed_url(event) end end def push_event_feed_url(event) if event.push_with_commits? && event.md_ref? if event.commits_count > 1 namespace_project_compare_url(event.project.namespace, event.project, from: event.commit_from, to: event.commit_to) else namespace_project_commit_url(event.project.namespace, event.project, id: event.commit_to) end else namespace_project_commits_url(event.project.namespace, event.project, event.ref_name) end end def event_feed_summary(event) if event.issue? render "events/event_issue", issue: event.issue elsif event.push? render "events/event_push", event: event elsif event.merge_request? render "events/event_merge_request", merge_request: event.merge_request elsif event.note? render "events/event_note", note: event.note end end def event_note_target_path(event) if event.note? && event.note_commit? namespace_project_commit_path(event.project.namespace, event.project, event.note_target) else polymorphic_path([event.project.namespace.becomes(Namespace), event.project, event.note_target], anchor: dom_id(event.target)) end end def event_note_title_html(event) if event.note_target if event.note_commit? link_to( namespace_project_commit_path(event.project.namespace, event.project, event.note_commit_id, anchor: dom_id(event.target)), class: "commit_short_id" ) do "#{event.note_target_type} #{event.note_short_commit_id}" end elsif event.note_project_snippet? link_to(namespace_project_snippet_path(event.project.namespace, event.project, event.note_target)) do "#{event.note_target_type} ##{truncate event.note_target_id}" end else link_to event_note_target_path(event) do "#{event.note_target_type} ##{truncate event.note_target_iid}" end end else content_tag :strong do "(deleted)" end end end def event_note(text, options = {}) text = first_line_in_markdown(text, 150, options) sanitize(text, tags: %w(a img b pre code p span)) end def event_commit_title(message) escape_once(truncate(message.split("\n").first, length: 70)) rescue "--broken encoding" end def event_to_atom(xml, event) if event.proper? xml.entry do event_link = event_feed_url(event) event_title = event_feed_title(event) event_summary = event_feed_summary(event) xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" xml.link href: event_link xml.title truncate(event_title, length: 80) xml.updated event.created_at.xmlschema xml.media :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(event.author_email)) xml.author do |author| xml.name event.author_name xml.email event.author_email end xml.summary(type: "xhtml") { |x| x << event_summary unless event_summary.nil? } end end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/nav_helper.rb0000644000175600017570000000160412672631600025504 0ustar pravipravimodule NavHelper def nav_menu_collapsed? cookies[:collapsed_nav] == 'true' end def nav_sidebar_class if nav_menu_collapsed? "sidebar-collapsed" else "sidebar-expanded" end end def page_sidebar_class if nav_menu_collapsed? "page-sidebar-collapsed" else "page-sidebar-expanded" end end def page_gutter_class if current_path?('merge_requests#show') || current_path?('merge_requests#diffs') || current_path?('merge_requests#commits') || current_path?('merge_requests#builds') || current_path?('issues#show') if cookies[:collapsed_gutter] == 'true' "page-gutter right-sidebar-collapsed" else "page-gutter right-sidebar-expanded" end end end def nav_header_class if nav_menu_collapsed? "header-collapsed" else "header-expanded" end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/auth_helper.rb0000644000175600017570000000342412672631600025663 0ustar pravipravimodule AuthHelper PROVIDERS_WITH_ICONS = %w(twitter github gitlab bitbucket google_oauth2 facebook azure_oauth2).freeze FORM_BASED_PROVIDERS = [/\Aldap/, 'crowd'].freeze def ldap_enabled? Gitlab.config.ldap.enabled end def omniauth_enabled? Gitlab.config.omniauth.enabled end def provider_has_icon?(name) PROVIDERS_WITH_ICONS.include?(name.to_s) end def auth_providers Gitlab::OAuth::Provider.providers end def label_for_provider(name) Gitlab::OAuth::Provider.label_for(name) end def form_based_provider?(name) FORM_BASED_PROVIDERS.any? { |pattern| pattern === name.to_s } end def form_based_providers auth_providers.select { |provider| form_based_provider?(provider) } end def crowd_enabled? auth_providers.include? :crowd end def button_based_providers auth_providers.reject { |provider| form_based_provider?(provider) } end def provider_image_tag(provider, size = 64) label = label_for_provider(provider) if provider_has_icon?(provider) file_name = "#{provider.to_s.split('_').first}_#{size}.png" image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}") else label end end def auth_active?(provider) current_user.identities.exists?(provider: provider.to_s) end def two_factor_skippable? current_application_settings.require_two_factor_authentication && !current_user.two_factor_enabled && current_application_settings.two_factor_grace_period && !two_factor_grace_period_expired? end def two_factor_grace_period_expired? current_user.otp_grace_period_started_at && (current_user.otp_grace_period_started_at + current_application_settings.two_factor_grace_period.hours) < Time.current end extend self end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/submodule_helper.rb0000644000175600017570000000454112672631600026722 0ustar pravipravimodule SubmoduleHelper include Gitlab::ShellAdapter # links to files listing for submodule if submodule is a project on this server def submodule_links(submodule_item, ref = nil, repository = @repository) url = repository.submodule_url_for(ref, submodule_item.path) return url, nil unless url =~ /([^\/:]+)\/([^\/]+\.git)\Z/ namespace = $1 project = $2 project.chomp!('.git') if self_url?(url, namespace, project) return namespace_project_path(namespace, project), namespace_project_tree_path(namespace, project, submodule_item.id) elsif relative_self_url?(url) relative_self_links(url, submodule_item.id) elsif github_dot_com_url?(url) standard_links('github.com', namespace, project, submodule_item.id) elsif gitlab_dot_com_url?(url) standard_links('gitlab.com', namespace, project, submodule_item.id) else return url, nil end end protected def github_dot_com_url?(url) url =~ /github\.com[\/:][^\/]+\/[^\/]+\Z/ end def gitlab_dot_com_url?(url) url =~ /gitlab\.com[\/:][^\/]+\/[^\/]+\Z/ end def self_url?(url, namespace, project) return true if url == [ Gitlab.config.gitlab.url, '/', namespace, '/', project, '.git' ].join('') url == gitlab_shell.url_to_repo([namespace, '/', project].join('')) end def relative_self_url?(url) # (./)?(../repo.git) || (./)?(../../project/repo.git) ) url =~ /\A((\.\/)?(\.\.\/))(?!(\.\.)|(.*\/)).*\.git\z/ || url =~ /\A((\.\/)?(\.\.\/){2})(?!(\.\.))([^\/]*)\/(?!(\.\.)|(.*\/)).*\.git\z/ end def standard_links(host, namespace, project, commit) base = [ 'https://', host, '/', namespace, '/', project ].join('') [base, [ base, '/tree/', commit ].join('')] end def relative_self_links(url, commit) # Map relative links to a namespace and project # For example: # ../bar.git -> same namespace, repo bar # ../foo/bar.git -> namespace foo, repo bar # ../../foo/bar/baz.git -> namespace bar, repo baz components = url.split('/') base = components.pop.gsub(/.git$/, '') namespace = components.pop.gsub(/^\.\.$/, '') if namespace.empty? namespace = @project.namespace.path end [ namespace_project_path(namespace, base), namespace_project_tree_path(namespace, base, commit) ] end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/ci_status_helper.rb0000644000175600017570000000243712672631600026723 0ustar pravipravimodule CiStatusHelper def ci_status_path(ci_commit) project = ci_commit.project builds_namespace_project_commit_path(project.namespace, project, ci_commit.sha) end def ci_status_icon(ci_commit) ci_icon_for_status(ci_commit.status) end def ci_status_label(ci_commit) ci_label_for_status(ci_commit.status) end def ci_status_with_icon(status) content_tag :span, class: "ci-status ci-#{status}" do ci_icon_for_status(status) + ' '.html_safe + ci_label_for_status(status) end end def ci_label_for_status(status) if status == 'success' 'passed' else status end end def ci_icon_for_status(status) icon_name = case status when 'success' 'check' when 'failed' 'close' when 'running', 'pending' 'clock-o' else 'circle' end icon(icon_name + ' fw') end def render_ci_status(ci_commit) link_to ci_status_icon(ci_commit), ci_status_path(ci_commit), class: "ci-status-link ci-status-icon-#{ci_commit.status.dasherize}", title: "Build #{ci_status_label(ci_commit)}", data: { toggle: 'tooltip', placement: 'left' } end def no_runners_for_project?(project) project.runners.blank? && Ci::Runner.shared.blank? end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/dashboard_helper.rb0000644000175600017570000000034712672631600026652 0ustar pravipravimodule DashboardHelper def assigned_issues_dashboard_path issues_dashboard_path(assignee_id: current_user.id) end def assigned_mrs_dashboard_path merge_requests_dashboard_path(assignee_id: current_user.id) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/git_helper.rb0000644000175600017570000000021612672631600025501 0ustar pravipravimodule GitHelper def strip_gpg_signature(text) text.gsub(/-----BEGIN PGP SIGNATURE-----(.*)-----END PGP SIGNATURE-----/m, "") end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/projects_helper.rb0000644000175600017570000002214312672631600026552 0ustar pravipravimodule ProjectsHelper def remove_from_project_team_message(project, member) if member.user "You are going to remove #{member.user.name} from #{project.name} project team. Are you sure?" else "You are going to revoke the invitation for #{member.invite_email} to join #{project.name} project team. Are you sure?" end end def link_to_project(project) link_to [project.namespace.becomes(Namespace), project] do title = content_tag(:span, project.name, class: 'project-name') if project.namespace namespace = content_tag(:span, "#{project.namespace.human_name} / ", class: 'namespace-name') title = namespace + title end title end end def link_to_member_avatar(author, opts = {}) default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name" } opts = default_opts.merge(opts) image_tag(avatar_icon(author, opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar] end def link_to_member(project, author, opts = {}) default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name" } opts = default_opts.merge(opts) return "(deleted)" unless author author_html = "" # Build avatar image tag author_html << image_tag(avatar_icon(author, opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar] # Build name span tag author_html << content_tag(:span, sanitize(author.name), class: opts[:author_class]) if opts[:name] author_html = author_html.html_safe if opts[:name] link_to(author_html, user_path(author), class: "author_link").html_safe else title = opts[:title].sub(":name", sanitize(author.name)) link_to(author_html, user_path(author), class: "author_link has_tooltip", data: { 'original-title'.to_sym => title, container: 'body' } ).html_safe end end def project_title(project, name = nil, url = nil) namespace_link = if project.group link_to(simple_sanitize(project.group.name), group_path(project.group)) else owner = project.namespace.owner link_to(simple_sanitize(owner.name), user_path(owner)) end project_link = link_to project_path(project), { class: "project-item-select-holder" } do link_output = simple_sanitize(project.name) if current_user link_output += project_select_tag :project_path, class: "project-item-select js-projects-dropdown", data: { include_groups: false, order_by: 'last_activity_at' } end link_output end project_link += icon "chevron-down", class: "dropdown-toggle-caret js-projects-dropdown-toggle" if current_user full_title = namespace_link + ' / ' + project_link full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name full_title end def remove_project_message(project) "You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?" end def transfer_project_message(project) "You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?" end def remove_fork_project_message(project) "You are going to remove the fork relationship to source project #{@project.forked_from_project.name_with_namespace}. Are you ABSOLUTELY sure?" end def project_nav_tabs @nav_tabs ||= get_project_nav_tabs(@project, current_user) end def project_nav_tab?(name) project_nav_tabs.include? name end def project_for_deploy_key(deploy_key) if deploy_key.projects.include?(@project) @project else deploy_key.projects.find { |project| can?(current_user, :read_project, project) } end end def can_change_visibility_level?(project, current_user) return false unless can?(current_user, :change_visibility_level, project) if project.forked? project.forked_from_project.visibility_level > Gitlab::VisibilityLevel::PRIVATE else true end end def user_max_access_in_project(user_id, project) level = project.team.max_member_access(user_id) if level Gitlab::Access.options_with_owner.key(level) end end private def get_project_nav_tabs(project, current_user) nav_tabs = [:home, :forks] if !project.empty_repo? && can?(current_user, :download_code, project) nav_tabs << [:files, :commits, :network, :graphs] end if project.repo_exists? && can?(current_user, :read_merge_request, project) nav_tabs << :merge_requests end if can?(current_user, :read_build, project) nav_tabs << :builds end if can?(current_user, :admin_project, project) nav_tabs << :settings end if can?(current_user, :read_issue, project) nav_tabs << :issues end if can?(current_user, :read_wiki, project) nav_tabs << :wiki end if can?(current_user, :read_project_snippet, project) nav_tabs << :snippets end if can?(current_user, :read_label, project) nav_tabs << :labels end if can?(current_user, :read_milestone, project) nav_tabs << :milestones end nav_tabs.flatten end def git_user_name if current_user current_user.name else "Your name" end end def git_user_email if current_user current_user.email else "your@email.com" end end def repository_size(project = @project) "#{project.repository_size} MB" rescue # In order to prevent 500 error # when application cannot allocate memory # to calculate repo size - just show 'Unknown' 'unknown' end def default_url_to_repo(project = @project) if default_clone_protocol == "ssh" project.ssh_url_to_repo else project.http_url_to_repo end end def default_clone_protocol if !current_user || current_user.require_ssh_key? "http" else "ssh" end end def project_last_activity(project) if project.last_activity_at time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago') else "Never" end end def add_contribution_guide_path(project) if project && !project.repository.contribution_guide namespace_project_new_blob_path( project.namespace, project, project.default_branch, file_name: "CONTRIBUTING.md", commit_message: "Add contribution guide" ) end end def add_changelog_path(project) if project && !project.repository.changelog namespace_project_new_blob_path( project.namespace, project, project.default_branch, file_name: "CHANGELOG", commit_message: "Add changelog" ) end end def add_license_path(project) if project && !project.repository.license namespace_project_new_blob_path( project.namespace, project, project.default_branch, file_name: "LICENSE", commit_message: "Add license" ) end end def contribution_guide_path(project) if project && contribution_guide = project.repository.contribution_guide namespace_project_blob_path( project.namespace, project, tree_join(project.default_branch, contribution_guide.name) ) end end def readme_path(project) filename_path(project, :readme) end def changelog_path(project) filename_path(project, :changelog) end def license_path(project) filename_path(project, :license) end def version_path(project) filename_path(project, :version) end def project_wiki_path_with_version(proj, page, version, is_newest) url_params = is_newest ? {} : { version_id: version } namespace_project_wiki_path(proj.namespace, proj, page, url_params) end def project_status_css_class(status) case status when "started" "active" when "failed" "danger" when "finished" "success" end end def leave_project_message(project) "Are you sure you want to leave \"#{project.name}\" project?" end def new_readme_path ref = @repository.root_ref if @repository ref ||= 'master' namespace_project_new_blob_path(@project.namespace, @project, tree_join(ref), file_name: 'README.md') end def last_push_event if current_user current_user.recent_push(@project.id) end end def readme_cache_key sha = @project.commit.try(:sha) || 'nil' [@project.path_with_namespace, sha, "readme"].join('-') end def round_commit_count(project) count = project.commit_count if count > 10000 '10000+' elsif count > 5000 '5000+' elsif count > 1000 '1000+' else count end end def current_ref @ref || @repository.try(:root_ref) end private def filename_path(project, filename) if project && blob = project.repository.send(filename) namespace_project_blob_path( project.namespace, project, tree_join(project.default_branch, blob.name) ) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/time_helper.rb0000644000175600017570000000126312672631600025657 0ustar pravipravimodule TimeHelper def duration_in_words(finished_at, started_at) if finished_at && started_at interval_in_seconds = finished_at.to_i - started_at.to_i elsif started_at interval_in_seconds = Time.now.to_i - started_at.to_i end time_interval_in_words(interval_in_seconds) end def time_interval_in_words(interval_in_seconds) minutes = interval_in_seconds / 60 seconds = interval_in_seconds - minutes * 60 if minutes >= 1 "#{pluralize(minutes, "minute")} #{pluralize(seconds, "second")}" else "#{pluralize(seconds, "second")}" end end def date_from_to(from, to) "#{from.to_s(:short)} - #{to.to_s(:short)}" end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/issuables_helper.rb0000644000175600017570000000157412672631600026720 0ustar pravipravimodule IssuablesHelper def sidebar_gutter_toggle_icon sidebar_gutter_collapsed? ? icon('angle-double-left') : icon('angle-double-right') end def sidebar_gutter_collapsed_class "right-sidebar-#{sidebar_gutter_collapsed? ? 'collapsed' : 'expanded'}" end def issuables_count(issuable) base_issuable_scope(issuable).maximum(:iid) end def next_issuable_for(issuable) base_issuable_scope(issuable).where('iid > ?', issuable.iid).last end def prev_issuable_for(issuable) base_issuable_scope(issuable).where('iid < ?', issuable.iid).first end private def sidebar_gutter_collapsed? cookies[:collapsed_gutter] == 'true' end def base_issuable_scope(issuable) issuable.project.send(issuable.class.table_name).send(issuable_state_scope(issuable)) end def issuable_state_scope(issuable) issuable.open? ? :opened : :closed end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/merge_requests_helper.rb0000644000175600017570000000571112672631600027755 0ustar pravipravimodule MergeRequestsHelper def new_mr_path_from_push_event(event) target_project = event.project.forked_from_project || event.project new_namespace_project_merge_request_path( event.project.namespace, event.project, new_mr_from_push_event(event, target_project) ) end def new_mr_from_push_event(event, target_project) { merge_request: { source_project_id: event.project.id, target_project_id: target_project.id, source_branch: event.branch_name, target_branch: target_project.repository.root_ref } } end def mr_css_classes(mr) classes = "merge-request" classes << " closed" if mr.closed? classes << " merged" if mr.merged? classes end def ci_build_details_path(merge_request) build_url = merge_request.source_project.ci_service.build_page(merge_request.last_commit.sha, merge_request.source_branch) return nil unless build_url parsed_url = URI.parse(build_url) unless parsed_url.userinfo.blank? parsed_url.userinfo = '' end parsed_url.to_s end def merge_path_description(merge_request, separator) if merge_request.for_fork? "Project:Branches: #{@merge_request.source_project_path}:#{@merge_request.source_branch} #{separator} #{@merge_request.target_project.path_with_namespace}:#{@merge_request.target_branch}" else "Branches: #{@merge_request.source_branch} #{separator} #{@merge_request.target_branch}" end end def issues_sentence(issues) # Sorting based on the `#123` or `group/project#123` reference will sort # local issues first. issues.map do |issue| issue.to_reference(@project) end.sort.to_sentence end def mr_change_branches_path(merge_request) new_namespace_project_merge_request_path( @project.namespace, @project, merge_request: { source_project_id: @merge_request.source_project_id, target_project_id: @merge_request.target_project_id, source_branch: @merge_request.source_branch, target_branch: @merge_request.target_branch, }, change_branches: true ) end def source_branch_with_namespace(merge_request) branch = link_to(merge_request.source_branch, namespace_project_commits_path(merge_request.source_project.namespace, merge_request.source_project, merge_request.source_branch)) if merge_request.for_fork? namespace = link_to(merge_request.source_project_namespace, project_path(merge_request.source_project)) namespace + ":" + branch else branch end end def format_mr_branch_names(merge_request) source_path = merge_request.source_project_path target_path = merge_request.target_project_path source_branch = merge_request.source_branch target_branch = merge_request.target_branch if source_path == target_path [source_branch, target_branch] else ["#{source_path}:#{source_branch}", "#{target_path}:#{target_branch}"] end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/broadcast_messages_helper.rb0000644000175600017570000000170212672631600030550 0ustar pravipravimodule BroadcastMessagesHelper def broadcast_message(message = BroadcastMessage.current) return unless message.present? content_tag :div, class: 'broadcast-message', style: broadcast_message_style(message) do icon('bullhorn') << ' ' << render_broadcast_message(message.message) end end def broadcast_message_style(broadcast_message) style = '' if broadcast_message.color.present? style << "background-color: #{broadcast_message.color}" style << '; ' if broadcast_message.font.present? end if broadcast_message.font.present? style << "color: #{broadcast_message.font}" end style end def broadcast_message_status(broadcast_message) if broadcast_message.active? 'Active' elsif broadcast_message.ended? 'Expired' else 'Pending' end end def render_broadcast_message(message) Banzai.render(message, pipeline: :broadcast_message).html_safe end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/branches_helper.rb0000644000175600017570000000073712672631600026513 0ustar pravipravimodule BranchesHelper def can_remove_branch?(project, branch_name) if project.protected_branch? branch_name false elsif branch_name == project.repository.root_ref false else can?(current_user, :push_code, project) end end def can_push_branch?(project, branch_name) return false unless project.repository.branch_names.include?(branch_name) ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(branch_name) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/version_check_helper.rb0000644000175600017570000000027712672631600027547 0ustar pravipravimodule VersionCheckHelper def version_status_badge if Rails.env.production? && current_application_settings.version_check_enabled image_tag VersionCheck.new.url end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/tags_helper.rb0000644000175600017570000000033112672631600025652 0ustar pravipravimodule TagsHelper def tag_path(tag) "/tags/#{tag}" end def tag_list(project) html = '' project.tag_list.each do |tag| html << link_to(tag, tag_path(tag)) end html.html_safe end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/graph_helper.rb0000644000175600017570000000152212672631600026020 0ustar pravipravimodule GraphHelper def get_refs(repo, commit) refs = "" # Commit::ref_names already strips the refs/XXX from important refs (e.g. refs/heads/XXX) # so anything leftover is internally used by GitLab commit_refs = commit.ref_names(repo).reject{ |name| name.starts_with?('refs/') } refs << commit_refs.join(' ') # append note count refs << "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0 refs end def parents_zip_spaces(parents, parent_spaces) ids = parents.map { |p| p.id } ids.zip(parent_spaces) end def success_ratio(success_builds, failed_builds) failed_builds = failed_builds.count(:all) success_builds = success_builds.count(:all) return 100 if failed_builds.zero? ratio = (success_builds.to_f / (success_builds + failed_builds)) * 100 ratio.to_i end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/triggers_helper.rb0000644000175600017570000000021712672631600026545 0ustar pravipravimodule TriggersHelper def builds_trigger_url(project_id) "#{Settings.gitlab.url}/api/v3/projects/#{project_id}/trigger/builds" end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/external_wiki_helper.rb0000644000175600017570000000061512672631600027566 0ustar pravipravimodule ExternalWikiHelper def get_project_wiki_path(project) external_wiki_service = project.services. find { |service| service.to_param == 'external_wiki' } if external_wiki_service.present? && external_wiki_service.active? external_wiki_service.properties['external_wiki_url'] else namespace_project_wiki_path(project.namespace, project, :home) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/search_helper.rb0000644000175600017570000001055012672631600026165 0ustar pravipravimodule SearchHelper def search_autocomplete_opts(term) return unless current_user resources_results = [ groups_autocomplete(term), projects_autocomplete(term) ].flatten generic_results = project_autocomplete + default_autocomplete + help_autocomplete generic_results.select! { |result| result[:label] =~ Regexp.new(term, "i") } [ resources_results, generic_results ].flatten.uniq do |item| item[:label] end end private # Autocomplete results for various settings pages def default_autocomplete [ { label: "Profile settings", url: profile_path }, { label: "SSH Keys", url: profile_keys_path }, { label: "Dashboard", url: root_path }, { label: "Admin Section", url: admin_root_path }, ] end # Autocomplete results for internal help pages def help_autocomplete [ { label: "help: API Help", url: help_page_path("api", "README") }, { label: "help: Markdown Help", url: help_page_path("markdown", "markdown") }, { label: "help: Permissions Help", url: help_page_path("permissions", "permissions") }, { label: "help: Public Access Help", url: help_page_path("public_access", "public_access") }, { label: "help: Rake Tasks Help", url: help_page_path("raketasks", "README") }, { label: "help: SSH Keys Help", url: help_page_path("ssh", "README") }, { label: "help: System Hooks Help", url: help_page_path("system_hooks", "system_hooks") }, { label: "help: Web Hooks Help", url: help_page_path("web_hooks", "web_hooks") }, { label: "help: Workflow Help", url: help_page_path("workflow", "README") }, ] end # Autocomplete results for the current project, if it's defined def project_autocomplete if @project && @project.repository.exists? && @project.repository.root_ref prefix = search_result_sanitize(@project.name_with_namespace) ref = @ref || @project.repository.root_ref [ { label: "#{prefix} - Files", url: namespace_project_tree_path(@project.namespace, @project, ref) }, { label: "#{prefix} - Commits", url: namespace_project_commits_path(@project.namespace, @project, ref) }, { label: "#{prefix} - Network", url: namespace_project_network_path(@project.namespace, @project, ref) }, { label: "#{prefix} - Graph", url: namespace_project_graph_path(@project.namespace, @project, ref) }, { label: "#{prefix} - Issues", url: namespace_project_issues_path(@project.namespace, @project) }, { label: "#{prefix} - Merge Requests", url: namespace_project_merge_requests_path(@project.namespace, @project) }, { label: "#{prefix} - Milestones", url: namespace_project_milestones_path(@project.namespace, @project) }, { label: "#{prefix} - Snippets", url: namespace_project_snippets_path(@project.namespace, @project) }, { label: "#{prefix} - Members", url: namespace_project_project_members_path(@project.namespace, @project) }, { label: "#{prefix} - Wiki", url: namespace_project_wikis_path(@project.namespace, @project) }, ] else [] end end # Autocomplete results for the current user's groups def groups_autocomplete(term, limit = 5) current_user.authorized_groups.search(term).limit(limit).map do |group| { label: "group: #{search_result_sanitize(group.name)}", url: group_path(group) } end end # Autocomplete results for the current user's projects def projects_autocomplete(term, limit = 5) current_user.authorized_projects.search_by_title(term). sorted_by_stars.non_archived.limit(limit).map do |p| { label: "project: #{search_result_sanitize(p.name_with_namespace)}", url: namespace_project_path(p.namespace, p) } end end def search_result_sanitize(str) Sanitize.clean(str) end def search_filter_path(options={}) exist_opts = { search: params[:search], project_id: params[:project_id], group_id: params[:group_id], scope: params[:scope] } options = exist_opts.merge(options) search_path(options) end # Sanitize html generated after parsing markdown from issue description or comment def search_md_sanitize(html) sanitize(html, tags: %w(a p ol ul li pre code)) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/explore_helper.rb0000644000175600017570000000123212672631600026373 0ustar pravipravimodule ExploreHelper def explore_projects_filter_path(options={}) exist_opts = { sort: params[:sort], scope: params[:scope], group: params[:group], tag: params[:tag], visibility_level: params[:visibility_level], } options = exist_opts.merge(options) path = if explore_controller? explore_projects_path elsif current_action?(:starred) starred_dashboard_projects_path else dashboard_projects_path end path << "?#{options.to_param}" path end def explore_controller? controller.class.name.split("::").first == "Explore" end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/blob_helper.rb0000644000175600017570000001076212672631600025643 0ustar pravipravimodule BlobHelper def highlighter(blob_name, blob_content, nowrap: false) Gitlab::Highlight.new(blob_name, blob_content, nowrap: nowrap) end def highlight(blob_name, blob_content, nowrap: false) Gitlab::Highlight.highlight(blob_name, blob_content, nowrap: nowrap) end def no_highlight_files %w(credits changelog news copying copyright license authors) end def edit_blob_link(project = @project, ref = @ref, path = @path, options = {}) return unless current_user blob = project.repository.blob_at(ref, path) rescue nil return unless blob && blob_text_viewable?(blob) from_mr = options[:from_merge_request_id] link_opts = {} link_opts[:from_merge_request_id] = from_mr if from_mr edit_path = namespace_project_edit_blob_path(project.namespace, project, tree_join(ref, path), link_opts) if !on_top_of_branch?(project, ref) button_tag "Edit", class: "btn btn-default disabled has_tooltip", title: "You can only edit files when you are on a branch", data: { container: 'body' } elsif can_edit_blob?(blob, project, ref) link_to "Edit", edit_path, class: 'btn' elsif can?(current_user, :fork_project, project) continue_params = { to: edit_path, notice: edit_in_new_fork_notice, notice_now: edit_in_new_fork_notice_now } fork_path = namespace_project_forks_path(project.namespace, project, namespace_key: current_user.namespace.id, continue: continue_params) link_to "Edit", fork_path, class: 'btn', method: :post end end def modify_file_link(project = @project, ref = @ref, path = @path, label:, action:, btn_class:, modal_type:) return unless current_user blob = project.repository.blob_at(ref, path) rescue nil return unless blob if !on_top_of_branch?(project, ref) button_tag label, class: "btn btn-#{btn_class} disabled has_tooltip", title: "You can only #{action} files when you are on a branch", data: { container: 'body' } elsif blob.lfs_pointer? button_tag label, class: "btn btn-#{btn_class} disabled has_tooltip", title: "It is not possible to #{action} files that are stored in LFS using the web interface", data: { container: 'body' } elsif can_edit_blob?(blob, project, ref) button_tag label, class: "btn btn-#{btn_class}", 'data-target' => "#modal-#{modal_type}-blob", 'data-toggle' => 'modal' elsif can?(current_user, :fork_project, project) continue_params = { to: request.fullpath, notice: edit_in_new_fork_notice + " Try to #{action} this file again.", notice_now: edit_in_new_fork_notice_now } fork_path = namespace_project_forks_path(project.namespace, project, namespace_key: current_user.namespace.id, continue: continue_params) link_to label, fork_path, class: "btn btn-#{btn_class}", method: :post end end def replace_blob_link(project = @project, ref = @ref, path = @path) modify_file_link( project, ref, path, label: "Replace", action: "replace", btn_class: "default", modal_type: "upload" ) end def delete_blob_link(project = @project, ref = @ref, path = @path) modify_file_link( project, ref, path, label: "Delete", action: "delete", btn_class: "remove", modal_type: "remove" ) end def can_edit_blob?(blob, project = @project, ref = @ref) !blob.lfs_pointer? && can_edit_tree?(project, ref) end def leave_edit_message "Leave edit mode?\nAll unsaved changes will be lost." end def editing_preview_title(filename) if Gitlab::MarkupHelper.previewable?(filename) 'Preview' else 'Preview Changes' end end # Return an image icon depending on the file mode and extension # # mode - File unix mode # mode - File name def blob_icon(mode, name) icon("#{file_type_icon_class('file', mode, name)} fw") end def blob_text_viewable?(blob) blob && blob.text? && !blob.lfs_pointer? end def blob_size(blob) if blob.lfs_pointer? blob.lfs_size else blob.size end end def blob_svg?(blob) blob.language && blob.language.name == 'SVG' end # SVGs can contain malicious JavaScript; only include whitelisted # elements and attributes. Note that this whitelist is by no means complete # and may omit some elements. def sanitize_svg(blob) blob.data = Loofah.scrub_fragment(blob.data, :strip).to_xml blob end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/todos_helper.rb0000644000175600017570000000434512672631600026055 0ustar pravipravimodule TodosHelper def todos_pending_count current_user.todos.pending.count end def todos_done_count current_user.todos.done.count end def todo_action_name(todo) case todo.action when Todo::ASSIGNED then 'assigned you' when Todo::MENTIONED then 'mentioned you on' end end def todo_target_link(todo) target = todo.target_type.titleize.downcase link_to "#{target} #{todo.target.to_reference}", todo_target_path(todo) end def todo_target_path(todo) anchor = dom_id(todo.note) if todo.note.present? polymorphic_path([todo.project.namespace.becomes(Namespace), todo.project, todo.target], anchor: anchor) end def todos_filter_params { state: params[:state], project_id: params[:project_id], author_id: params[:author_id], type: params[:type], action_id: params[:action_id], } end def todos_filter_path(options = {}) without = options.delete(:without) options = todos_filter_params.merge(options) if without.present? without.each do |key| options.delete(key) end end path = request.path path << "?#{options.to_param}" path end def todo_actions_options actions = [ OpenStruct.new(id: '', title: 'Any Action'), OpenStruct.new(id: Todo::ASSIGNED, title: 'Assigned'), OpenStruct.new(id: Todo::MENTIONED, title: 'Mentioned') ] options_from_collection_for_select(actions, 'id', 'title', params[:action_id]) end def todo_projects_options projects = current_user.authorized_projects.sorted_by_activity.non_archived projects = projects.includes(:namespace) projects = projects.map do |project| OpenStruct.new(id: project.id, title: project.name_with_namespace) end projects.unshift(OpenStruct.new(id: '', title: 'Any Project')) options_from_collection_for_select(projects, 'id', 'title', params[:project_id]) end def todo_types_options types = [ OpenStruct.new(title: 'Any Type', name: ''), OpenStruct.new(title: 'Issue', name: 'Issue'), OpenStruct.new(title: 'Merge Request', name: 'MergeRequest') ] options_from_collection_for_select(types, 'name', 'title', params[:type]) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/notifications_helper.rb0000644000175600017570000000326412672631600027575 0ustar pravipravimodule NotificationsHelper include IconsHelper def notification_icon(notification) if notification.disabled? icon('volume-off', class: 'ns-mute') elsif notification.participating? icon('volume-down', class: 'ns-part') elsif notification.watch? icon('volume-up', class: 'ns-watch') else icon('circle-o', class: 'ns-default') end end def notification_list_item(notification_level, user_membership) case notification_level when Notification::N_DISABLED update_notification_link(Notification::N_DISABLED, user_membership, 'Disabled', 'microphone-slash') when Notification::N_PARTICIPATING update_notification_link(Notification::N_PARTICIPATING, user_membership, 'Participate', 'volume-up') when Notification::N_WATCH update_notification_link(Notification::N_WATCH, user_membership, 'Watch', 'eye') when Notification::N_MENTION update_notification_link(Notification::N_MENTION, user_membership, 'On mention', 'at') when Notification::N_GLOBAL update_notification_link(Notification::N_GLOBAL, user_membership, 'Global', 'globe') else # do nothing end end def update_notification_link(notification_level, user_membership, title, icon) content_tag(:li, class: active_level_for(user_membership, notification_level)) do link_to '#', class: 'update-notification', data: { notification_level: notification_level } do icon("#{icon} fw", text: title) end end end def notification_label(user_membership) Notification.new(user_membership).to_s end def active_level_for(user_membership, level) 'active' if user_membership.notification_level == level end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/milestones_helper.rb0000644000175600017570000000261112672631600027101 0ustar pravipravimodule MilestonesHelper def milestones_filter_path(opts = {}) if @project namespace_project_milestones_path(@project.namespace, @project, opts) elsif @group group_milestones_path(@group, opts) else dashboard_milestones_path(opts) end end def milestone_progress_bar(milestone) options = { class: 'progress-bar progress-bar-success', style: "width: #{milestone.percent_complete}%;" } content_tag :div, class: 'progress' do content_tag :div, nil, options end end def projects_milestones_options milestones = if @project @project.milestones else Milestone.where(project_id: @projects) end.active epoch = DateTime.parse('1970-01-01') grouped_milestones = GlobalMilestone.build_collection(milestones) grouped_milestones = grouped_milestones.sort_by { |x| x.due_date.nil? ? epoch : x.due_date } grouped_milestones.unshift(Milestone::None) grouped_milestones.unshift(Milestone::Any) options_from_collection_for_select(grouped_milestones, 'name', 'title', params[:milestone_title]) end def milestone_remaining_days(milestone) if milestone.expired? content_tag(:strong, 'expired') elsif milestone.due_date days = milestone.remaining_days content = content_tag(:strong, days) content << " #{'day'.pluralize(days)} remaining" end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/button_helper.rb0000644000175600017570000000317512672631600026240 0ustar pravipravimodule ButtonHelper # Output a "Copy to Clipboard" button # # data - Data attributes passed to `content_tag` # # Examples: # # # Define the clipboard's text # clipboard_button(clipboard_text: "Foo") # # => "" # # # Define the target element # clipboard_button(clipboard_target: "div#foo") # # => "" # # See http://clipboardjs.com/#usage def clipboard_button(data = {}) content_tag :button, icon('clipboard'), class: 'btn btn-clipboard', data: data, type: :button end def http_clone_button(project) klass = 'btn js-protocol-switch' klass << ' active' if default_clone_protocol == 'http' klass << ' has_tooltip' if current_user.try(:require_password?) protocol = gitlab_config.protocol.upcase content_tag :button, protocol, class: klass, data: { clone: project.http_url_to_repo, container: 'body', html: 'true', title: "Set a password on your account
to pull or push via #{protocol}" }, type: :button end def ssh_clone_button(project) klass = 'btn js-protocol-switch' klass << ' active' if default_clone_protocol == 'ssh' klass << ' has_tooltip' if current_user.try(:require_ssh_key?) content_tag :button, 'SSH', class: klass, data: { clone: project.ssh_url_to_repo, container: 'body', html: 'true', title: 'Add an SSH key to your profile
to pull or push via SSH.' }, type: :button end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/ci_badge_helper.rb0000644000175600017570000000074612672631600026443 0ustar pravipravimodule CiBadgeHelper def markdown_badge_code(project, ref) url = status_ci_project_url(project, ref: ref, format: 'png') link = namespace_project_commits_path(project.namespace, project, ref) "[![build status](#{url})](#{link})" end def html_badge_code(project, ref) url = status_ci_project_url(project, ref: ref, format: 'png') link = namespace_project_commits_path(project.namespace, project, ref) "" end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/namespaces_helper.rb0000644000175600017570000000151712672631600027042 0ustar pravipravimodule NamespacesHelper def namespaces_options(selected = :current_user, display_path: false) groups = current_user.owned_groups + current_user.masters_groups users = [current_user.namespace] group_opts = ["Groups", groups.sort_by(&:human_name).map {|g| [display_path ? g.path : g.human_name, g.id]} ] users_opts = [ "Users", users.sort_by(&:human_name).map {|u| [display_path ? u.path : u.human_name, u.id]} ] options = [] options << group_opts options << users_opts if selected == :current_user && current_user.namespace selected = current_user.namespace.id end grouped_options_for_select(options, selected) end def namespace_icon(namespace, size = 40) if namespace.kind_of?(Group) group_icon(namespace) else avatar_icon(namespace.owner.email, size) end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/visibility_level_helper.rb0000644000175600017570000000430312672631600030275 0ustar pravipravimodule VisibilityLevelHelper def visibility_level_color(level) case level when Gitlab::VisibilityLevel::PRIVATE 'vs-private' when Gitlab::VisibilityLevel::INTERNAL 'vs-internal' when Gitlab::VisibilityLevel::PUBLIC 'vs-public' end end # Return the description for the +level+ argument. # # +level+ One of the Gitlab::VisibilityLevel constants # +form_model+ Either a model object (Project, Snippet, etc.) or the name of # a Project or Snippet class. def visibility_level_description(level, form_model) case form_model when Project project_visibility_level_description(level) when Snippet snippet_visibility_level_description(level, form_model) end end def project_visibility_level_description(level) case level when Gitlab::VisibilityLevel::PRIVATE "Project access must be granted explicitly to each user." when Gitlab::VisibilityLevel::INTERNAL "The project can be cloned by any logged in user." when Gitlab::VisibilityLevel::PUBLIC "The project can be cloned without any authentication." end end def snippet_visibility_level_description(level, snippet = nil) case level when Gitlab::VisibilityLevel::PRIVATE if snippet.is_a? ProjectSnippet "The snippet is visible only to project members." else "The snippet is visible only to me." end when Gitlab::VisibilityLevel::INTERNAL "The snippet is visible to any logged in user." when Gitlab::VisibilityLevel::PUBLIC "The snippet can be accessed without any authentication." end end def visibility_level_label(level) Project.visibility_levels.key(level) end def restricted_visibility_levels(show_all = false) return [] if current_user.is_admin? && !show_all current_application_settings.restricted_visibility_levels || [] end def default_project_visibility current_application_settings.default_project_visibility end def default_snippet_visibility current_application_settings.default_snippet_visibility end def skip_level?(form_model, level) form_model.is_a?(Project) && !form_model.visibility_level_allowed?(level) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/labels_helper.rb0000644000175600017570000000634212672631600026166 0ustar pravipravimodule LabelsHelper include ActionView::Helpers::TagHelper # Link to a Label # # label - Label object to link to # project - Project object which will be used as the context for the label's # link. If omitted, defaults to `@project`, or the label's own # project. # type - The type of item the link will point to (:issue or # :merge_request). If omitted, defaults to :issue. # block - An optional block that will be passed to `link_to`, forming the # body of the link element. If omitted, defaults to # `render_colored_label`. # # Examples: # # # Allow the generated link to use the label's own project # link_to_label(label) # # # Force the generated link to use @project # @project = Project.first # link_to_label(label) # # # Force the generated link to use a provided project # link_to_label(label, project: Project.last) # # # Force the generated link to point to merge requests instead of issues # link_to_label(label, type: :merge_request) # # # Customize link body with a block # link_to_label(label) { "My Custom Label Text" } # # Returns a String def link_to_label(label, project: nil, type: :issue, &block) project ||= @project || label.project link = send("namespace_project_#{type.to_s.pluralize}_path", project.namespace, project, label_name: label.name) if block_given? link_to link, &block else link_to render_colored_label(label), link end end def project_label_names @project.labels.pluck(:title) end def render_colored_label(label) label_color = label.color || Label::DEFAULT_COLOR text_color = text_color_for_bg(label_color) # Intentionally not using content_tag here so that this method can be called # by LabelReferenceFilter span = %() + escape_once(label.name) + '' span.html_safe end def suggested_colors [ '#0033CC', '#428BCA', '#44AD8E', '#A8D695', '#5CB85C', '#69D100', '#004E00', '#34495E', '#7F8C8D', '#A295D6', '#5843AD', '#8E44AD', '#FFECDB', '#AD4363', '#D10069', '#CC0033', '#FF0000', '#D9534F', '#D1D100', '#F0AD4E', '#AD8D43' ] end def text_color_for_bg(bg_color) if bg_color.length == 4 r, g, b = bg_color[1, 4].scan(/./).map { |v| (v * 2).hex } else r, g, b = bg_color[1, 7].scan(/.{2}/).map(&:hex) end if (r + g + b) > 500 '#333333' else '#FFFFFF' end end def projects_labels_options labels = if @project @project.labels else Label.where(project_id: @projects) end grouped_labels = GlobalLabel.build_collection(labels) grouped_labels.unshift(Label::None) grouped_labels.unshift(Label::Any) options_from_collection_for_select(grouped_labels, 'name', 'title', params[:label_name]) end # Required for Banzai::Filter::LabelReferenceFilter module_function :render_colored_label, :text_color_for_bg, :escape_once end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/compare_helper.rb0000644000175600017570000000111612672631600026344 0ustar pravipravimodule CompareHelper def create_mr_button?(from = params[:from], to = params[:to], project = @project) from.present? && to.present? && from != to && project.merge_requests_enabled && project.repository.branch_names.include?(from) && project.repository.branch_names.include?(to) end def create_mr_path(from = params[:from], to = params[:to], project = @project) new_namespace_project_merge_request_path( project.namespace, project, merge_request: { source_branch: to, target_branch: from } ) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/tab_helper.rb0000644000175600017570000000702412672631600025470 0ustar pravipravimodule TabHelper # Navigation link helper # # Returns an `li` element with an 'active' class if the supplied # controller(s) and/or action(s) are currently active. The content of the # element is the value passed to the block. # # options - The options hash used to determine if the element is "active" (default: {}) # :controller - One or more controller names to check (optional). # :action - One or more action names to check (optional). # :path - A shorthand path, such as 'dashboard#index', to check (optional). # :html_options - Extra options to be passed to the list element (optional). # block - An optional block that will become the contents of the returned # `li` element. # # When both :controller and :action are specified, BOTH must match in order # to be marked as active. When only one is given, either can match. # # Examples # # # Assuming we're on TreeController#show # # # Controller matches, but action doesn't # nav_link(controller: [:tree, :refs], action: :edit) { "Hello" } # # => '
  • Hello
  • ' # # # Controller matches # nav_link(controller: [:tree, :refs]) { "Hello" } # # => '
  • Hello
  • ' # # # Several paths # nav_link(path: ['tree#show', 'profile#show']) { "Hello" } # # => '
  • Hello
  • ' # # # Shorthand path # nav_link(path: 'tree#show') { "Hello" } # # => '
  • Hello
  • ' # # # Supplying custom options for the list element # nav_link(controller: :tree, html_options: {class: 'home'}) { "Hello" } # # => '
  • Hello
  • ' # # Returns a list item element String def nav_link(options = {}, &block) klass = active_nav_link?(options) ? 'active' : '' # Add our custom class into the html_options, which may or may not exist # and which may or may not already have a :class key o = options.delete(:html_options) || {} o[:class] ||= '' o[:class] += ' ' + klass o[:class].strip! if block_given? content_tag(:li, capture(&block), o) else content_tag(:li, nil, o) end end def active_nav_link?(options) if path = options.delete(:path) unless path.respond_to?(:each) path = [path] end path.any? do |single_path| current_path?(single_path) end elsif page = options.delete(:page) unless page.respond_to?(:each) page = [page] end page.any? do |single_page| current_page?(single_page) end else c = options.delete(:controller) a = options.delete(:action) if c && a # When given both options, make sure BOTH are true current_controller?(*c) && current_action?(*a) else # Otherwise check EITHER option current_controller?(*c) || current_action?(*a) end end end def current_path?(path) c, a, _ = path.split('#') current_controller?(c) && current_action?(a) end def project_tab_class return "active" if current_page?(controller: "/projects", action: :edit, id: @project) if ['services', 'hooks', 'deploy_keys', 'protected_branches'].include? controller.controller_name "active" end end def branches_tab_class if current_controller?(:protected_branches) || current_controller?(:branches) || current_page?(namespace_project_repository_path(@project.namespace, @project)) 'active' end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/helpers/issues_helper.rb0000644000175600017570000000771512672631600026244 0ustar pravipravimodule IssuesHelper def issue_css_classes(issue) classes = "issue" classes << " closed" if issue.closed? classes << " today" if issue.today? classes end # Returns an OpenStruct object suitable for use by options_from_collection_for_select # to allow filtering issues by an unassigned User or Milestone def unassigned_filter # Milestone uses :title, Issue uses :name OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned') end def url_for_project_issues(project = @project, options = {}) return '' if project.nil? if options[:only_path] project.issues_tracker.project_path else project.issues_tracker.project_url end end def url_for_new_issue(project = @project, options = {}) return '' if project.nil? if options[:only_path] project.issues_tracker.new_issue_path else project.issues_tracker.new_issue_url end end def url_for_issue(issue_iid, project = @project, options = {}) return '' if project.nil? if options[:only_path] project.issues_tracker.issue_path(issue_iid) else project.issues_tracker.issue_url(issue_iid) end end def bulk_update_milestone_options milestones = @project.milestones.active.reorder(due_date: :asc, title: :asc).to_a milestones.unshift(Milestone::None) options_from_collection_for_select(milestones, 'id', 'title', params[:milestone_id]) end def milestone_options(object) milestones = object.project.milestones.active.reorder(due_date: :asc, title: :asc).to_a milestones.unshift(Milestone::None) options_from_collection_for_select(milestones, 'id', 'title', object.milestone_id) end def status_box_class(item) if item.respond_to?(:expired?) && item.expired? 'status-box-expired' elsif item.respond_to?(:merged?) && item.merged? 'status-box-merged' elsif item.closed? 'status-box-closed' else 'status-box-open' end end def issue_button_visibility(issue, closed) return 'hidden' if issue.closed? == closed end def issue_to_atom(xml, issue) xml.entry do xml.id namespace_project_issue_url(issue.project.namespace, issue.project, issue) xml.link href: namespace_project_issue_url(issue.project.namespace, issue.project, issue) xml.title truncate(issue.title, length: 80) xml.updated issue.created_at.xmlschema xml.media :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(issue.author_email)) xml.author do |author| xml.name issue.author_name xml.email issue.author_email end xml.summary issue.title end end def merge_requests_sentence(merge_requests) # Sorting based on the `!123` or `group/project!123` reference will sort # local merge requests first. merge_requests.map do |merge_request| merge_request.to_reference(@project) end.sort.to_sentence(last_word_connector: ', or ') end def emoji_icon(name, unicode = nil, aliases = []) unicode ||= Emoji.emoji_filename(name) rescue "" content_tag :div, "", class: "icon emoji-icon emoji-#{unicode}", title: name, data: { aliases: aliases.join(' '), emoji: name, unicode_name: unicode } end def emoji_author_list(notes, current_user) list = notes.map do |note| note.author == current_user ? "me" : note.author.name end list.join(", ") end def note_active_class(notes, current_user) if current_user && notes.pluck(:author_id).include?(current_user.id) "active" else "" end end def awards_sort(awards) awards.sort_by do |award, notes| if award == "thumbsup" 0 elsif award == "thumbsdown" 1 else 2 end end.to_h end # Required for Banzai::Filter::IssueReferenceFilter module_function :url_for_issue end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/0000755000175600017570000000000012672631600023367 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/lfs_object_uploader.rb0000644000175600017570000000065012672631600027722 0ustar pravipravi# encoding: utf-8 class LfsObjectUploader < CarrierWave::Uploader::Base storage :file def store_dir "#{Gitlab.config.lfs.storage_path}/#{model.oid[0,2]}/#{model.oid[2,2]}" end def cache_dir "#{Gitlab.config.lfs.storage_path}/tmp/cache" end def move_to_cache true end def move_to_store true end def exists? file.try(:exists?) end def filename model.oid[4..-1] end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/avatar_uploader.rb0000644000175600017570000000051712672631600027070 0ustar pravipravi# encoding: utf-8 class AvatarUploader < CarrierWave::Uploader::Base include UploaderHelper storage :file after :store, :reset_events_cache def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def reset_events_cache(file) model.reset_events_cache if model.is_a?(User) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/file_uploader.rb0000644000175600017570000000167212672631600026534 0ustar pravipravi# encoding: utf-8 class FileUploader < CarrierWave::Uploader::Base include UploaderHelper storage :file attr_accessor :project, :secret def initialize(project, secret = self.class.generate_secret) @project = project @secret = secret end def base_dir "uploads" end def store_dir File.join(base_dir, @project.path_with_namespace, @secret) end def cache_dir File.join(base_dir, 'tmp', @project.path_with_namespace, @secret) end def self.generate_secret SecureRandom.hex end def secure_url File.join("/uploads", @secret, file.filename) end def to_h filename = image? ? self.file.basename : self.file.filename escaped_filename = filename.gsub("]", "\\]") markdown = "[#{escaped_filename}](#{self.secure_url})" markdown.prepend("!") if image? { alt: filename, url: self.secure_url, is_image: image?, markdown: markdown } end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/uploader_helper.rb0000644000175600017570000000070412672631600027067 0ustar pravipravi# Extra methods for uploader module UploaderHelper def image? img_ext = %w(png jpg jpeg gif bmp tiff) if file.respond_to?(:extension) img_ext.include?(file.extension.downcase) else # Not all CarrierWave storages respond to :extension ext = file.path.split('.').last.downcase img_ext.include?(ext) end rescue false end def file_storage? self.class.storage == CarrierWave::Storage::File end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/attachment_uploader.rb0000644000175600017570000000032612672631600027740 0ustar pravipravi# encoding: utf-8 class AttachmentUploader < CarrierWave::Uploader::Base include UploaderHelper storage :file def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/uploaders/artifact_uploader.rb0000644000175600017570000000153612672631600027411 0ustar pravipravi# encoding: utf-8 class ArtifactUploader < CarrierWave::Uploader::Base storage :file attr_accessor :build, :field def self.artifacts_path Gitlab.config.artifacts.path end def self.artifacts_upload_path File.join(self.artifacts_path, 'tmp/uploads/') end def self.artifacts_cache_path File.join(self.artifacts_path, 'tmp/cache/') end def initialize(build, field) @build, @field = build, field end def store_dir File.join(self.class.artifacts_path, @build.artifacts_path) end def cache_dir File.join(self.class.artifacts_cache_path, @build.artifacts_path) end def file_storage? self.class.storage == CarrierWave::Storage::File end def filename file.try(:filename) end def exists? file.try(:exists?) end def move_to_cache true end def move_to_store true end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/0000755000175600017570000000000012672631600023023 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/milestones_finder.rb0000644000175600017570000000045212672631600027062 0ustar pravipraviclass MilestonesFinder def execute(projects, params) milestones = Milestone.of_projects(projects) milestones = milestones.reorder("due_date ASC") case params[:state] when 'closed' then milestones.closed when 'all' then milestones else milestones.active end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/projects_finder.rb0000644000175600017570000000332112672631600026527 0ustar pravipraviclass ProjectsFinder # Returns all projects, optionally including group projects a user has access # to. # # ## Examples # # Retrieving all public projects: # # ProjectsFinder.new.execute # # Retrieving all public/internal projects and those the given user has access # to: # # ProjectsFinder.new.execute(some_user) # # Retrieving all public/internal projects as well as the group's projects the # user has access to: # # ProjectsFinder.new.execute(some_user, group: some_group) # # Returns an ActiveRecord::Relation. def execute(current_user = nil, options = {}) group = options[:group] if group segments = group_projects(current_user, group) else segments = all_projects(current_user) end if segments.length > 1 union = Gitlab::SQL::Union.new(segments.map { |s| s.select(:id) }) Project.where("projects.id IN (#{union.to_sql})") else segments.first end end private def group_projects(current_user, group) if current_user [ group_projects_for_user(current_user, group), group.projects.public_and_internal_only ] else [group.projects.public_only] end end def all_projects(current_user) if current_user [current_user.authorized_projects, public_and_internal_projects] else [Project.public_only] end end def group_projects_for_user(current_user, group) if group.users.include?(current_user) group.projects else group.projects.visible_to_user(current_user) end end def public_projects Project.unscoped.public_only end def public_and_internal_projects Project.unscoped.public_and_internal_only end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/merge_requests_finder.rb0000644000175600017570000000077212672631600027737 0ustar pravipravi# Finders::MergeRequest class # # Used to filter MergeRequests collections by set of params # # Arguments: # current_user - which user use # params: # scope: 'created-by-me' or 'assigned-to-me' or 'all' # state: 'open' or 'closed' or 'all' # group_id: integer # project_id: integer # milestone_id: integer # assignee_id: integer # search: string # label_name: string # sort: string # class MergeRequestsFinder < IssuableFinder def klass MergeRequest end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/issues_finder.rb0000644000175600017570000000073712672631600026221 0ustar pravipravi# Finders::Issues class # # Used to filter Issues collections by set of params # # Arguments: # current_user - which user use # params: # scope: 'created-by-me' or 'assigned-to-me' or 'all' # state: 'open' or 'closed' or 'all' # group_id: integer # project_id: integer # milestone_id: integer # assignee_id: integer # search: string # label_name: string # sort: string # class IssuesFinder < IssuableFinder def klass Issue end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/personal_projects_finder.rb0000644000175600017570000000204112672631600030430 0ustar pravipraviclass PersonalProjectsFinder def initialize(user) @user = user end # Finds the projects belonging to the user in "@user", limited to either # public projects or projects visible to the given user. # # current_user - When given the list of projects is limited to those only # visible by this user. # # Returns an ActiveRecord::Relation. def execute(current_user = nil) if current_user relation = projects_visible_to_user(current_user) else relation = public_projects end relation.includes(:namespace).order_id_desc end private def projects_visible_to_user(current_user) authorized = @user.personal_projects.visible_to_user(current_user) union = Gitlab::SQL::Union. new([authorized.select(:id), public_and_internal_projects.select(:id)]) Project.where("projects.id IN (#{union.to_sql})") end def public_projects @user.personal_projects.public_only end def public_and_internal_projects @user.personal_projects.public_and_internal_only end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/issuable_finder.rb0000644000175600017570000001347312672631600026516 0ustar pravipravi# IssuableFinder # # Used to filter Issues and MergeRequests collections by set of params # # Arguments: # klass - actual class like Issue or MergeRequest # current_user - which user use # params: # scope: 'created-by-me' or 'assigned-to-me' or 'all' # state: 'open' or 'closed' or 'all' # group_id: integer # project_id: integer # milestone_title: string # assignee_id: integer # search: string # label_name: string # sort: string # require_relative 'projects_finder' class IssuableFinder NONE = '0' attr_accessor :current_user, :params def initialize(current_user, params) @current_user = current_user @params = params end def execute items = init_collection items = by_scope(items) items = by_state(items) items = by_group(items) items = by_project(items) items = by_search(items) items = by_milestone(items) items = by_assignee(items) items = by_author(items) items = by_label(items) sort(items) end def group return @group if defined?(@group) @group = if params[:group_id].present? Group.find(params[:group_id]) else nil end end def project? params[:project_id].present? end def project return @project if defined?(@project) if project? @project = Project.find(params[:project_id]) unless Ability.abilities.allowed?(current_user, :read_project, @project) @project = nil end else @project = nil end @project end def projects return @projects if defined?(@projects) if project? @projects = project elsif current_user && params[:authorized_only].presence && !current_user_related? @projects = current_user.authorized_projects.reorder(nil) else @projects = ProjectsFinder.new.execute(current_user, group: group). reorder(nil) end end def search params[:search].presence end def milestones? params[:milestone_title].present? end def filter_by_no_milestone? milestones? && params[:milestone_title] == Milestone::None.title end def milestones return @milestones if defined?(@milestones) @milestones = if milestones? scope = Milestone.where(project_id: projects) scope.where(title: params[:milestone_title]) else nil end end def labels? params[:label_name].present? end def filter_by_no_label? labels? && params[:label_name] == Label::None.title end def labels return @labels if defined?(@labels) if labels? && !filter_by_no_label? @labels = Label.where(title: label_names) if projects @labels = @labels.where(project: projects) end else @labels = Label.none end end def assignee? params[:assignee_id].present? end def assignee return @assignee if defined?(@assignee) @assignee = if assignee? && params[:assignee_id] != NONE User.find(params[:assignee_id]) else nil end end def author? params[:author_id].present? end def author return @author if defined?(@author) @author = if author? && params[:author_id] != NONE User.find(params[:author_id]) else nil end end private def init_collection klass.all end def by_scope(items) case params[:scope] when 'created-by-me', 'authored' then items.where(author_id: current_user.id) when 'all' then items when 'assigned-to-me' then items.where(assignee_id: current_user.id) else raise 'You must specify default scope' end end def by_state(items) case params[:state] when 'closed' items.closed when 'merged' items.respond_to?(:merged) ? items.merged : items.closed when 'all' items when 'opened' items.opened else raise 'You must specify default state' end end def by_group(items) items = items.of_group(group) if group items end def by_project(items) items = if project? items.of_projects(projects).references_project elsif projects items.merge(projects.reorder(nil)).join_project else items.none end items end def by_search(items) items = items.search(search) if search items end def sort(items) # Ensure we always have an explicit sort order (instead of inheriting # multiple orders when combining ActiveRecord::Relation objects). params[:sort] ? items.sort(params[:sort]) : items.reorder(id: :desc) end def by_assignee(items) if assignee? items = items.where(assignee_id: assignee.try(:id)) end items end def by_author(items) if author? items = items.where(author_id: author.try(:id)) end items end def by_milestone(items) if milestones? if filter_by_no_milestone? items = items.where(milestone_id: [-1, nil]) else items = items.joins(:milestone).where(milestones: { title: params[:milestone_title] }) if projects items = items.where(milestones: { project_id: projects }) end end end items end def by_label(items) if labels? if filter_by_no_label? items = items. joins("LEFT OUTER JOIN label_links ON label_links.target_type = '#{klass.name}' AND label_links.target_id = #{klass.table_name}.id"). where(label_links: { id: nil }) else items = items.joins(:labels).where(labels: { title: label_names }) if projects items = items.where(labels: { project_id: projects }) end end end items end def label_names params[:label_name].split(',') end def current_user_related? params[:scope] == 'created-by-me' || params[:scope] == 'authored' || params[:scope] == 'assigned-to-me' end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/snippets_finder.rb0000644000175600017570000000243712672631600026552 0ustar pravipraviclass SnippetsFinder def execute(current_user, params = {}) filter = params[:filter] case filter when :all then snippets(current_user).fresh.non_expired when :by_user then by_user(current_user, params[:user], params[:scope]) when :by_project by_project(current_user, params[:project]) end end private def snippets(current_user) if current_user Snippet.public_and_internal else # Not authenticated # # Return only: # public snippets Snippet.are_public end end def by_user(current_user, user, scope) snippets = user.snippets.fresh.non_expired return snippets.are_public unless current_user if user == current_user case scope when 'are_internal' then snippets.are_internal when 'are_private' then snippets.are_private when 'are_public' then snippets.are_public else snippets end else snippets.public_and_internal end end def by_project(current_user, project) snippets = project.snippets.fresh.non_expired if current_user if project.team.member?(current_user.id) snippets else snippets.public_and_internal end else snippets.are_public end end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/trending_projects_finder.rb0000644000175600017570000000036112672631600030422 0ustar pravipraviclass TrendingProjectsFinder def execute(current_user, start_date = 1.month.ago) projects_for(current_user).trending(start_date) end private def projects_for(current_user) ProjectsFinder.new.execute(current_user) end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/contributed_projects_finder.rb0000644000175600017570000000167012672631600031136 0ustar pravipraviclass ContributedProjectsFinder def initialize(user) @user = user end # Finds the projects "@user" contributed to, limited to either public projects # or projects visible to the given user. # # current_user - When given the list of the projects is limited to those only # visible by this user. # # Returns an ActiveRecord::Relation. def execute(current_user = nil) if current_user relation = projects_visible_to_user(current_user) else relation = public_projects end relation.includes(:namespace).order_id_desc end private def projects_visible_to_user(current_user) authorized = @user.contributed_projects.visible_to_user(current_user) union = Gitlab::SQL::Union. new([authorized.select(:id), public_projects.select(:id)]) Project.where("projects.id IN (#{union.to_sql})") end def public_projects @user.contributed_projects.public_only end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/notes_finder.rb0000644000175600017570000000161512672631600026032 0ustar pravipraviclass NotesFinder FETCH_OVERLAP = 5.seconds def execute(project, current_user, params) target_type = params[:target_type] target_id = params[:target_id] # Default to 0 to remain compatible with old clients last_fetched_at = Time.at(params.fetch(:last_fetched_at, 0).to_i) notes = case target_type when "commit" project.notes.for_commit_id(target_id).not_inline when "issue" project.issues.find(target_id).notes.nonawards.inc_author when "merge_request" project.merge_requests.find(target_id).mr_and_commit_notes.nonawards.inc_author when "snippet", "project_snippet" project.snippets.find(target_id).notes else raise 'invalid target_type' end # Use overlapping intervals to avoid worrying about race conditions notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP).fresh end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/todos_finder.rb0000644000175600017570000000406612672631600026035 0ustar pravipravi# TodosFinder # # Used to filter Todos by set of params # # Arguments: # current_user - which user use # params: # action_id: integer # author_id: integer # project_id; integer # state: 'pending' or 'done' # type: 'Issue' or 'MergeRequest' # class TodosFinder NONE = '0' attr_accessor :current_user, :params def initialize(current_user, params) @current_user = current_user @params = params end def execute items = current_user.todos items = by_action_id(items) items = by_author(items) items = by_project(items) items = by_state(items) items = by_type(items) items end private def action_id? action_id.present? && [Todo::ASSIGNED, Todo::MENTIONED].include?(action_id.to_i) end def action_id params[:action_id] end def author? params[:author_id].present? end def author return @author if defined?(@author) @author = if author? && params[:author_id] != NONE User.find(params[:author_id]) else nil end end def project? params[:project_id].present? end def project return @project if defined?(@project) if project? @project = Project.find(params[:project_id]) unless Ability.abilities.allowed?(current_user, :read_project, @project) @project = nil end else @project = nil end @project end def type? type.present? && ['Issue', 'MergeRequest'].include?(type) end def type params[:type] end def by_action_id(items) if action_id? items = items.where(action: action_id) end items end def by_author(items) if author? items = items.where(author_id: author.try(:id)) end items end def by_project(items) if project? items = items.where(project: project) end items end def by_state(items) case params[:state] when 'done' items.done else items.pending end end def by_type(items) if type? items = items.where(target_type: type) end items end end gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/finders/README.md0000644000175600017570000000072312672631600024304 0ustar pravipravi# Finders This type of classes responsible for collection items based on different conditions. To prevent lookup methods in models like this: ```ruby class Project def issues_for_user_filtered_by(user, filter) # A lot of logic not related to project model itself end end issues = project.issues_for_user_filtered_by(user, params) ``` Better use this: ```ruby issues = IssuesFinder.new(project, user, filter).execute ``` It will help keep models thiner. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/0000755000175600017570000000000012672631600022673 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/0000755000175600017570000000000012672631600025247 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/0000755000175600017570000000000012672631600027216 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/monokai.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/monokai.s0000644000175600017570000001006112672631600031035 0ustar pravipravi/* https://github.com/richleland/pygments-css/blob/master/monokai.css */ .code.monokai { // Line numbers .line-numbers, .diff-line-num { background-color: #272822; } .diff-line-num, .diff-line-num a { color: rgba(255, 255, 255, 0.3); } // Code itself pre.code, .diff-line-num { border-color: #555; } &, pre.code, .line_holder .line_content { background-color: #272822; color: #f8f8f2; } // Diff line .line_holder { .diff-line-num.new, .line_content.new { @include diff_background(rgba(166, 226, 46, 0.1), rgba(166, 226, 46, 0.15), #808080); } .diff-line-num.old, .line_content.old { @include diff_background(rgba(254, 147, 140, 0.15), rgba(254, 147, 140, 0.2), #808080); } .line_content.match { color: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.1); } } // highlight line via anchor pre .hll { background-color: #49483e !important; } // Search result highlight span.highlight_word { background-color: #ffe792 !important; color: #000000 !important; } .hll { background-color: #49483e } .c { color: #75715e } /* Comment */ .err { color: #960050; background-color: #1e0010 } /* Error */ .k { color: #66d9ef } /* Keyword */ .l { color: #ae81ff } /* Literal */ .n { color: #f8f8f2 } /* Name */ .o { color: #f92672 } /* Operator */ .p { color: #f8f8f2 } /* Punctuation */ .cm { color: #75715e } /* Comment.Multiline */ .cp { color: #75715e } /* Comment.Preproc */ .c1 { color: #75715e } /* Comment.Single */ .cs { color: #75715e } /* Comment.Special */ .ge { font-style: italic } /* Generic.Emph */ .gs { font-weight: bold } /* Generic.Strong */ .kc { color: #66d9ef } /* Keyword.Constant */ .kd { color: #66d9ef } /* Keyword.Declaration */ .kn { color: #f92672 } /* Keyword.Namespace */ .kp { color: #66d9ef } /* Keyword.Pseudo */ .kr { color: #66d9ef } /* Keyword.Reserved */ .kt { color: #66d9ef } /* Keyword.Type */ .ld { color: #e6db74 } /* Literal.Date */ .m { color: #ae81ff } /* Literal.Number */ .s { color: #e6db74 } /* Literal.String */ .na { color: #a6e22e } /* Name.Attribute */ .nb { color: #f8f8f2 } /* Name.Builtin */ .nc { color: #a6e22e } /* Name.Class */ .no { color: #66d9ef } /* Name.Constant */ .nd { color: #a6e22e } /* Name.Decorator */ .ni { color: #f8f8f2 } /* Name.Entity */ .ne { color: #a6e22e } /* Name.Exception */ .nf { color: #a6e22e } /* Name.Function */ .nl { color: #f8f8f2 } /* Name.Label */ .nn { color: #f8f8f2 } /* Name.Namespace */ .nx { color: #a6e22e } /* Name.Other */ .py { color: #f8f8f2 } /* Name.Property */ .nt { color: #f92672 } /* Name.Tag */ .nv { color: #f8f8f2 } /* Name.Variable */ .ow { color: #f92672 } /* Operator.Word */ .w { color: #f8f8f2 } /* Text.Whitespace */ .mf { color: #ae81ff } /* Literal.Number.Float */ .mh { color: #ae81ff } /* Literal.Number.Hex */ .mi { color: #ae81ff } /* Literal.Number.Integer */ .mo { color: #ae81ff } /* Literal.Number.Oct */ .sb { color: #e6db74 } /* Literal.String.Backtick */ .sc { color: #e6db74 } /* Literal.String.Char */ .sd { color: #e6db74 } /* Literal.String.Doc */ .s2 { color: #e6db74 } /* Literal.String.Double */ .se { color: #ae81ff } /* Literal.String.Escape */ .sh { color: #e6db74 } /* Literal.String.Heredoc */ .si { color: #e6db74 } /* Literal.String.Interpol */ .sx { color: #e6db74 } /* Literal.String.Other */ .sr { color: #e6db74 } /* Literal.String.Regex */ .s1 { color: #e6db74 } /* Literal.String.Single */ .ss { color: #e6db74 } /* Literal.String.Symbol */ .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ .vc { color: #f8f8f2 } /* Name.Variable.Class */ .vg { color: #f8f8f2 } /* Name.Variable.Global */ .vi { color: #f8f8f2 } /* Name.Variable.Instance */ .il { color: #ae81ff } /* Literal.Number.Integer.Long */ .gh { } /* Generic Heading & Diff Header */ .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ } ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/solarized_dark.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/solarized0000644000175600017570000001127612672631600031144 0ustar pravipravi/* https://gist.github.com/qguv/7936275 */ .code.solarized-dark { // Line numbers .line-numbers, .diff-line-num { background-color: #002b36; } .diff-line-num, .diff-line-num a { color: rgba(255, 255, 255, 0.3); } // Code itself pre.code, .diff-line-num { border-color: #113b46; } &, pre.code, .line_holder .line_content { background-color: #002b36; color: #93a1a1; } // Diff line .line_holder { .diff-line-num.new, .line_content.new { @include diff_background(rgba(133, 153, 0, 0.15), rgba(133, 153, 0, 0.25), #113b46); } .diff-line-num.old, .line_content.old { @include diff_background(rgba(220, 50, 47, 0.3), rgba(220, 50, 47, 0.25), #113b46); } .line_content.match { color: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.1); } } // highlight line via anchor pre .hll { background-color: #174652 !important; } // Search result highlight span.highlight_word { background-color: #094554 !important; } /* Solarized Dark For use with Jekyll and Pygments http://ethanschoonover.com/solarized SOLARIZED HEX ROLE --------- -------- ------------------------------------------ base03 #002b36 background base01 #586e75 comments / secondary content base1 #93a1a1 body text / default code / primary content orange #cb4b16 constants red #dc322f regex, special keywords blue #268bd2 reserved keywords cyan #2aa198 strings, numbers green #859900 operators, other keywords */ .c { color: #586e75 } /* Comment */ .err { color: #93a1a1 } /* Error */ .g { color: #93a1a1 } /* Generic */ .k { color: #859900 } /* Keyword */ .l { color: #93a1a1 } /* Literal */ .n { color: #93a1a1 } /* Name */ .o { color: #859900 } /* Operator */ .x { color: #cb4b16 } /* Other */ .p { color: #93a1a1 } /* Punctuation */ .cm { color: #586e75 } /* Comment.Multiline */ .cp { color: #859900 } /* Comment.Preproc */ .c1 { color: #586e75 } /* Comment.Single */ .cs { color: #859900 } /* Comment.Special */ .gd { color: #2aa198 } /* Generic.Deleted */ .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */ .gr { color: #dc322f } /* Generic.Error */ .gh { color: #cb4b16 } /* Generic.Heading */ .gi { color: #859900 } /* Generic.Inserted */ .go { color: #93a1a1 } /* Generic.Output */ .gp { color: #93a1a1 } /* Generic.Prompt */ .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */ .gu { color: #cb4b16 } /* Generic.Subheading */ .gt { color: #93a1a1 } /* Generic.Traceback */ .kc { color: #cb4b16 } /* Keyword.Constant */ .kd { color: #268bd2 } /* Keyword.Declaration */ .kn { color: #859900 } /* Keyword.Namespace */ .kp { color: #859900 } /* Keyword.Pseudo */ .kr { color: #268bd2 } /* Keyword.Reserved */ .kt { color: #dc322f } /* Keyword.Type */ .ld { color: #93a1a1 } /* Literal.Date */ .m { color: #2aa198 } /* Literal.Number */ .s { color: #2aa198 } /* Literal.String */ .na { color: #93a1a1 } /* Name.Attribute */ .nb { color: #B58900 } /* Name.Builtin */ .nc { color: #268bd2 } /* Name.Class */ .no { color: #cb4b16 } /* Name.Constant */ .nd { color: #268bd2 } /* Name.Decorator */ .ni { color: #cb4b16 } /* Name.Entity */ .ne { color: #cb4b16 } /* Name.Exception */ .nf { color: #268bd2 } /* Name.Function */ .nl { color: #93a1a1 } /* Name.Label */ .nn { color: #93a1a1 } /* Name.Namespace */ .nx { color: #93a1a1 } /* Name.Other */ .py { color: #93a1a1 } /* Name.Property */ .nt { color: #268bd2 } /* Name.Tag */ .nv { color: #268bd2 } /* Name.Variable */ .ow { color: #859900 } /* Operator.Word */ .w { color: #93a1a1 } /* Text.Whitespace */ .mf { color: #2aa198 } /* Literal.Number.Float */ .mh { color: #2aa198 } /* Literal.Number.Hex */ .mi { color: #2aa198 } /* Literal.Number.Integer */ .mo { color: #2aa198 } /* Literal.Number.Oct */ .sb { color: #586e75 } /* Literal.String.Backtick */ .sc { color: #2aa198 } /* Literal.String.Char */ .sd { color: #93a1a1 } /* Literal.String.Doc */ .s2 { color: #2aa198 } /* Literal.String.Double */ .se { color: #cb4b16 } /* Literal.String.Escape */ .sh { color: #93a1a1 } /* Literal.String.Heredoc */ .si { color: #2aa198 } /* Literal.String.Interpol */ .sx { color: #2aa198 } /* Literal.String.Other */ .sr { color: #dc322f } /* Literal.String.Regex */ .s1 { color: #2aa198 } /* Literal.String.Single */ .ss { color: #2aa198 } /* Literal.String.Symbol */ .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ .vc { color: #268bd2 } /* Name.Variable.Class */ .vg { color: #268bd2 } /* Name.Variable.Global */ .vi { color: #268bd2 } /* Name.Variable.Instance */ .il { color: #2aa198 } /* Literal.Number.Integer.Long */ } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/solarized_light.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/solarized0000644000175600017570000001126312672631600031140 0ustar pravipravi/* https://gist.github.com/qguv/7936275 */ .code.solarized-light { // Line numbers .line-numbers, .diff-line-num { background-color: #fdf6e3; } .diff-line-num, .diff-line-num a { color: rgba(0, 0, 0, 0.3); } // Code itself pre.code, .diff-line-num { border-color: #c5d0d4; } &, pre.code, .line_holder .line_content { background-color: #fdf6e3; color: #586e75; } // Diff line .line_holder { .diff-line-num.new, .line_content.new { @include diff_background(rgba(133, 153, 0, 0.2), rgba(133, 153, 0, 0.25), #c5d0d4); } .diff-line-num.old, .line_content.old { @include diff_background(rgba(220, 50, 47, 0.2), rgba(220, 50, 47, 0.25), #c5d0d4); } .line_content.match { color: rgba(0, 0, 0, 0.3); background: rgba(255, 255, 255, 0.4); } } // highlight line via anchor pre .hll { background-color: #ddd8c5 !important; } // Search result highlight span.highlight_word { background-color: #eee8d5 !important; } /* Solarized Light For use with Jekyll and Pygments http://ethanschoonover.com/solarized SOLARIZED HEX ROLE --------- -------- ------------------------------------------ base01 #586e75 body text / default code / primary content base1 #93a1a1 comments / secondary content base3 #fdf6e3 background orange #cb4b16 constants red #dc322f regex, special keywords blue #268bd2 reserved keywords cyan #2aa198 strings, numbers green #859900 operators, other keywords */ .c { color: #93a1a1 } /* Comment */ .err { color: #586e75 } /* Error */ .g { color: #586e75 } /* Generic */ .k { color: #859900 } /* Keyword */ .l { color: #586e75 } /* Literal */ .n { color: #586e75 } /* Name */ .o { color: #859900 } /* Operator */ .x { color: #cb4b16 } /* Other */ .p { color: #586e75 } /* Punctuation */ .cm { color: #93a1a1 } /* Comment.Multiline */ .cp { color: #859900 } /* Comment.Preproc */ .c1 { color: #93a1a1 } /* Comment.Single */ .cs { color: #859900 } /* Comment.Special */ .gd { color: #2aa198 } /* Generic.Deleted */ .ge { color: #586e75; font-style: italic } /* Generic.Emph */ .gr { color: #dc322f } /* Generic.Error */ .gh { color: #cb4b16 } /* Generic.Heading */ .gi { color: #859900 } /* Generic.Inserted */ .go { color: #586e75 } /* Generic.Output */ .gp { color: #586e75 } /* Generic.Prompt */ .gs { color: #586e75; font-weight: bold } /* Generic.Strong */ .gu { color: #cb4b16 } /* Generic.Subheading */ .gt { color: #586e75 } /* Generic.Traceback */ .kc { color: #cb4b16 } /* Keyword.Constant */ .kd { color: #268bd2 } /* Keyword.Declaration */ .kn { color: #859900 } /* Keyword.Namespace */ .kp { color: #859900 } /* Keyword.Pseudo */ .kr { color: #268bd2 } /* Keyword.Reserved */ .kt { color: #dc322f } /* Keyword.Type */ .ld { color: #586e75 } /* Literal.Date */ .m { color: #2aa198 } /* Literal.Number */ .s { color: #2aa198 } /* Literal.String */ .na { color: #586e75 } /* Name.Attribute */ .nb { color: #B58900 } /* Name.Builtin */ .nc { color: #268bd2 } /* Name.Class */ .no { color: #cb4b16 } /* Name.Constant */ .nd { color: #268bd2 } /* Name.Decorator */ .ni { color: #cb4b16 } /* Name.Entity */ .ne { color: #cb4b16 } /* Name.Exception */ .nf { color: #268bd2 } /* Name.Function */ .nl { color: #586e75 } /* Name.Label */ .nn { color: #586e75 } /* Name.Namespace */ .nx { color: #586e75 } /* Name.Other */ .py { color: #586e75 } /* Name.Property */ .nt { color: #268bd2 } /* Name.Tag */ .nv { color: #268bd2 } /* Name.Variable */ .ow { color: #859900 } /* Operator.Word */ .w { color: #586e75 } /* Text.Whitespace */ .mf { color: #2aa198 } /* Literal.Number.Float */ .mh { color: #2aa198 } /* Literal.Number.Hex */ .mi { color: #2aa198 } /* Literal.Number.Integer */ .mo { color: #2aa198 } /* Literal.Number.Oct */ .sb { color: #93a1a1 } /* Literal.String.Backtick */ .sc { color: #2aa198 } /* Literal.String.Char */ .sd { color: #586e75 } /* Literal.String.Doc */ .s2 { color: #2aa198 } /* Literal.String.Double */ .se { color: #cb4b16 } /* Literal.String.Escape */ .sh { color: #586e75 } /* Literal.String.Heredoc */ .si { color: #2aa198 } /* Literal.String.Interpol */ .sx { color: #2aa198 } /* Literal.String.Other */ .sr { color: #dc322f } /* Literal.String.Regex */ .s1 { color: #2aa198 } /* Literal.String.Single */ .ss { color: #2aa198 } /* Literal.String.Symbol */ .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ .vc { color: #268bd2 } /* Name.Variable.Class */ .vg { color: #268bd2 } /* Name.Variable.Global */ .vi { color: #268bd2 } /* Name.Variable.Instance */ .il { color: #2aa198 } /* Literal.Number.Integer.Long */ } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/white.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/white.scs0000644000175600017570000000623112672631600031052 0ustar pravipravi/* https://github.com/aahan/pygments-github-style */ .code.white { // Line numbers .line-numbers, .diff-line-num { background-color: $background-color; } .diff-line-num, .diff-line-num a { color: rgba(0, 0, 0, 0.3); } // Code itself pre.code, .diff-line-num { border-color: $border-color; } &, pre.code, .line_holder .line_content { background-color: #fff; color: #333; } // Diff line .line_holder { .diff-line-num { &.old { background: #ffdddd; border-color: #f1c0c0; } &.new { background: #dbffdb; border-color: #c1e9c1; } } .line_content { &.old { background: #ffecec; span.idiff { background-color: #f8cbcb; } } &.new { background: #eaffea; span.idiff { background-color: #a6f3a6; } } &.match { color: rgba(0, 0, 0, 0.3); background: #fafafa; } } } // highlight line via anchor pre .hll { background-color: #f8eec7 !important; } // Search result highlight span.highlight_word { background-color: #fafe3d !important; } .hll { background-color: #f8f8f8 } .c { color: #999988; font-style: italic; } .err { color: #a61717; background-color: #e3d2d2; } .k { font-weight: bold; } .o { font-weight: bold; } .cm { color: #999988; font-style: italic; } .cp { color: #999999; font-weight: bold; } .c1 { color: #999988; font-style: italic; } .cs { color: #999999; font-weight: bold; font-style: italic; } .gd { color: #000000; background-color: #ffdddd; } .gd .x { color: #000000; background-color: #ffaaaa; } .ge { font-style: italic; } .gr { color: #aa0000; } .gh { color: #999999; } .gi { color: #000000; background-color: #ddffdd; } .gi .x { color: #000000; background-color: #aaffaa; } .go { color: #888888; } .gp { color: #555555; } .gs { font-weight: bold; } .gu { color: #800080; font-weight: bold; } .gt { color: #aa0000; } .kc { font-weight: bold; } .kd { font-weight: bold; } .kn { font-weight: bold; } .kp { font-weight: bold; } .kr { font-weight: bold; } .kt { color: #445588; font-weight: bold; } .m { color: #009999; } .s { color: #dd1144; } .n { color: #333333; } .na { color: teal; } .nb { color: #0086b3; } .nc { color: #445588; font-weight: bold; } .no { color: teal; } .ni { color: purple; } .ne { color: #990000; font-weight: bold; } .nf { color: #990000; font-weight: bold; } .nn { color: #555555; } .nt { color: navy; } .nv { color: teal; } .ow { font-weight: bold; } .w { color: #bbbbbb; } .mf { color: #009999; } .mh { color: #009999; } .mi { color: #009999; } .mo { color: #009999; } .sb { color: #dd1144; } .sc { color: #dd1144; } .sd { color: #dd1144; } .s2 { color: #dd1144; } .se { color: #dd1144; } .sh { color: #dd1144; } .si { color: #dd1144; } .sx { color: #dd1144; } .sr { color: #009926; } .s1 { color: #dd1144; } .ss { color: #990073; } .bp { color: #999999; } .vc { color: teal; } .vg { color: teal; } .vi { color: teal; } .il { color: #009999; } .gc { color: #999; background-color: #EAF2F5; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/highlight/dark.scss0000644000175600017570000001004212672631600031031 0ustar pravipravi/* https://github.com/MozMorris/tomorrow-pygments */ .code.dark { // Line numbers .line-numbers, .diff-line-num { background-color: #1d1f21; } .diff-line-num, .diff-line-num a { color: rgba(255, 255, 255, 0.3); } // Code itself pre.code, .diff-line-num { border-color: #666; } &, pre.code, .line_holder .line_content { background-color: #1d1f21; color: #c5c8c6; } // Diff line .line_holder { .diff-line-num.new, .line_content.new { @include diff_background(rgba(51, 255, 51, 0.1), rgba(51, 255, 51, 0.2), #808080); } .diff-line-num.old, .line_content.old { @include diff_background(rgba(255, 51, 51, 0.2), rgba(255, 51, 51, 0.25), #808080); } .line_content.match { color: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.1); } } // highlight line via anchor pre .hll { background-color: #557 !important; } // Search result highlight span.highlight_word { background-color: #ffe792 !important; color: #000000 !important; } .hll { background-color: #373b41 } .c { color: #969896 } /* Comment */ .err { color: #cc6666 } /* Error */ .k { color: #b294bb } /* Keyword */ .l { color: #de935f } /* Literal */ .n { color: #c5c8c6 } /* Name */ .o { color: #8abeb7 } /* Operator */ .p { color: #c5c8c6 } /* Punctuation */ .cm { color: #969896 } /* Comment.Multiline */ .cp { color: #969896 } /* Comment.Preproc */ .c1 { color: #969896 } /* Comment.Single */ .cs { color: #969896 } /* Comment.Special */ .gd { color: #cc6666 } /* Generic.Deleted */ .ge { font-style: italic } /* Generic.Emph */ .gh { color: #c5c8c6; font-weight: bold } /* Generic.Heading */ .gi { color: #b5bd68 } /* Generic.Inserted */ .gp { color: #969896; font-weight: bold } /* Generic.Prompt */ .gs { font-weight: bold } /* Generic.Strong */ .gu { color: #8abeb7; font-weight: bold } /* Generic.Subheading */ .kc { color: #b294bb } /* Keyword.Constant */ .kd { color: #b294bb } /* Keyword.Declaration */ .kn { color: #8abeb7 } /* Keyword.Namespace */ .kp { color: #b294bb } /* Keyword.Pseudo */ .kr { color: #b294bb } /* Keyword.Reserved */ .kt { color: #f0c674 } /* Keyword.Type */ .ld { color: #b5bd68 } /* Literal.Date */ .m { color: #de935f } /* Literal.Number */ .s { color: #b5bd68 } /* Literal.String */ .na { color: #81a2be } /* Name.Attribute */ .nb { color: #c5c8c6 } /* Name.Builtin */ .nc { color: #f0c674 } /* Name.Class */ .no { color: #cc6666 } /* Name.Constant */ .nd { color: #8abeb7 } /* Name.Decorator */ .ni { color: #c5c8c6 } /* Name.Entity */ .ne { color: #cc6666 } /* Name.Exception */ .nf { color: #81a2be } /* Name.Function */ .nl { color: #c5c8c6 } /* Name.Label */ .nn { color: #f0c674 } /* Name.Namespace */ .nx { color: #81a2be } /* Name.Other */ .py { color: #c5c8c6 } /* Name.Property */ .nt { color: #8abeb7 } /* Name.Tag */ .nv { color: #cc6666 } /* Name.Variable */ .ow { color: #8abeb7 } /* Operator.Word */ .w { color: #c5c8c6 } /* Text.Whitespace */ .mf { color: #de935f } /* Literal.Number.Float */ .mh { color: #de935f } /* Literal.Number.Hex */ .mi { color: #de935f } /* Literal.Number.Integer */ .mo { color: #de935f } /* Literal.Number.Oct */ .sb { color: #b5bd68 } /* Literal.String.Backtick */ .sc { color: #c5c8c6 } /* Literal.String.Char */ .sd { color: #969896 } /* Literal.String.Doc */ .s2 { color: #b5bd68 } /* Literal.String.Double */ .se { color: #de935f } /* Literal.String.Escape */ .sh { color: #b5bd68 } /* Literal.String.Heredoc */ .si { color: #de935f } /* Literal.String.Interpol */ .sx { color: #b5bd68 } /* Literal.String.Other */ .sr { color: #b5bd68 } /* Literal.String.Regex */ .s1 { color: #b5bd68 } /* Literal.String.Single */ .ss { color: #b5bd68 } /* Literal.String.Symbol */ .bp { color: #c5c8c6 } /* Name.Builtin.Pseudo */ .vc { color: #cc6666 } /* Name.Variable.Class */ .vg { color: #cc6666 } /* Name.Variable.Global */ .vi { color: #cc6666 } /* Name.Variable.Instance */ .il { color: #de935f } /* Literal.Number.Integer.Long */ } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/behaviors.scss0000644000175600017570000000060512672631600030127 0ustar pravipravi// Details //-------- .js-details-container { .content { display: none; &.hide { display: block; } } &.open .content { display: block; &.hide { display: none; } } } // Toggle between two states. .js-toggler-container { .turn-on { display: block; } .turn-off { display: none; } &.on { .turn-on { display: none; } .turn-off { display: block; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/0000755000175600017570000000000012672631600026346 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/builds.scss0000644000175600017570000000233112672631600030524 0ustar pravipravi.build-page { pre.trace { background: #111111; color: #fff; font-family: $monospace_font; white-space: pre; white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ overflow: auto; overflow-y: hidden; font-size: 12px; .fa-refresh { font-size: 24px; margin-left: 20px; } } .autoscroll-container { position: fixed; bottom: 20px; right: 20px; z-index: 100; } .scroll-controls { position: fixed; bottom: 10px; left: 250px; z-index: 100; a { display: block; margin-bottom: 10px; } } .page-sidebar-collapsed { .scroll-controls { left: 70px; } } .build-widget { padding: 10px; background: $background-color; margin-bottom: 20px; border-radius: 4px; .title { margin-top: 0; color: #666; line-height: 1.5; } .attr-name { color: #777; } } .alert-disabled { background: $background-color; a { color: #3084bb !important; } } } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/merge_requests.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/merge_request0000644000175600017570000000706312672631600031146 0ustar pravipravi/** * MR -> show: Automerge widget * */ .mr-state-widget { background: $background-color; color: $gl-gray; border: 1px solid $border-color; @include border-radius(2px); form { margin-bottom: 0; .clearfix { margin-bottom: 0; } } .accept-merge-holder { .accept-action { display: inline-block; float: left; .accept_merge_request { &.ci-pending, &.ci-running { @include btn-orange; } &.ci-skipped, &.ci-failed, &.ci-canceled, &.ci-error { @include btn-red; } } } .accept-control { display: inline-block; float: left; margin: 0; margin-left: 20px; padding: 5px; padding-top: 12px; line-height: 20px; &.right { float: right; a { color: $gl-gray; } } .remove_source_checkbox { margin: 0; } } } .ci_widget { border-bottom: 1px solid #eef0f2; i { margin-right: 4px; } &.ci-success { color: $gl-success; } &.ci-skipped { background-color: #eee; color: #888; } &.ci-pending, &.ci-running { color: $gl-warning; } &.ci-failed, &.ci-canceled, &.ci-error { color: $gl-danger; } a.monospace { color: inherit; } } .mr-widget-body, .ci_widget, .mr-widget-footer { padding: $gl-padding; } .normal { color: #5c5d5e; } .mr-widget-body { h4 { font-weight: 600; font-size: 17px; margin: 5px 0; color: #313236; } p:last-child { margin-bottom: 0; } } .mr-widget-footer { border-top: 1px solid #EEE; } .ci-coverage { float: right; } } .mr_source_commit, .mr_target_commit { .commit { margin: 0; padding: 2px 0; list-style: none; &:hover { background: none; } } } .label-branch { color: #313236; font-family: $monospace_font; font-weight: bold; overflow: hidden; font-size: 90%; margin: 0 3px; } .mr-list { .merge-request { padding: 10px 15px; position: relative; .merge-request-title { margin-bottom: 5px; font-size: $list-font-size; font-weight: 600; } .merge-request-info { color: $gl-gray; } } .merge-request-labels { display: inline-block; } .merge-request-no-comments { opacity: 0.5; } } .merge-request-angle { text-align: center; margin: 0 auto; font-size: 2em; line-height: 1.1; } // hide mr close link for inline diff comment form .diff-file .close-mr-link, .diff-file .reopen-mr-link { display: none; } .merge-request-form .select2-container { width: 250px !important; } #modal_merge_info .modal-dialog { width: 600px; .btn-clipboard { @extend .pull-right; margin-right: 20px; margin-top: 5px; position: absolute; right: 0; } } .mr-source-target { line-height: 31px; } .disabled-comment-area { padding: 16px 0; .disabled-profile { width: 40px; height: 40px; background: $border-gray-dark; border-radius: 20px; display: inline-block; margin-right: 10px; } .disabled-comment { background: $gray-light; display: inline-block; vertical-align: top; height: 200px; border-radius: 4px; border: 1px solid $border-gray-normal; padding-top: 90px; text-align: center; right: 20px; position: absolute; left: 70px; margin-bottom: 20px; span { color: #B2B2B2; a { color: $md-link-color; } } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/runners.scss0000644000175600017570000000062112672631600030736 0ustar pravipravi.runner-state { padding: 6px 12px; margin-right: 10px; color: #FFF; &.runner-state-shared { background: #32b186; } &.runner-state-specific { background: #3498db; } } .runner-status-online { color: green; } .runner-status-offline { color: gray; } .runner-status-paused { color: red; } .runner { .btn { padding: 1px 6px; } h4 { font-weight: normal; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/commits.scss0000644000175600017570000000530012672631600030714 0ustar pravipravi.commits-compare-switch{ @include btn-default; @include btn-white; background: image-url("switch_icon.png") no-repeat center center; text-indent: -9999px; float: left; margin-right: 9px; } .lists-separator { margin: 10px 0; border-color: #DDD; } .commits-row { ul { margin: 0; li.commit { padding: 8px 0; } } .commits-row-date { font-size: 15px; line-height: 20px; margin-bottom: 5px; } } li.commit { list-style: none; .commit-row-title { font-size: $list-font-size; line-height: 20px; margin-bottom: 2px; .btn-clipboard { margin-top: -1px; } .notes_count { float: right; margin-right: 10px; } .commit_short_id { min-width: 65px; font-family: $monospace_font; } .str-truncated { max-width: 70%; } .commit-row-message { color: $gl-link-color; &:hover { text-decoration: underline; } } .text-expander { background: #eee; color: #555; padding: 0 5px; cursor: pointer; margin-left: 4px; &:hover { background-color: #ddd; } } } .commit-row-description { font-size: 14px; border-left: 1px solid #EEE; padding: 10px 15px; margin: 5px 0 10px 5px; background: #f9f9f9; display: none; pre { border: none; background: inherit; padding: 0; margin: 0; } } .commit-row-info { color: $gl-gray; line-height: 24px; font-size: 13px; a { color: $gl-gray; } .committed_ago { display: inline-block; } } &.inline-commit { .commit-row-title { font-size: 13px; } .committed_ago { float: right; @extend .cgray; } } } .branch-commit { color: $gl-gray; .commit-id, .commit-row-message { color: $gl-gray; } } .divergence-graph { padding: 12px 12px 0 0; float: right; .graph-side { position: relative; width: 80px; height: 22px; padding: 5px 0 13px; float: left; .bar { position: absolute; height: 4px; background-color: #ccc; } .bar-behind { right: 0; border-radius: 3px 0 0 3px; } .bar-ahead { left: 0; border-radius: 0 3px 3px 0; } .count { padding-top: 6px; padding-bottom: 0px; font-size: 12px; color: #333; display: block; } .count-behind { padding-right: 4px; text-align: right; } .count-ahead { padding-left: 4px; text-align: left; } } .graph-separator { position: relative; width: 1px; height: 18px; margin: 5px 0 0; float: left; background-color: #ccc; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/tree.scss0000644000175600017570000000350012672631600030200 0ustar pravipravi.tree-holder { > .nav-block { margin: 11px 0; } .file-finder { width: 50%; .file-finder-input { width: 95%; display: inline-block; } } .tree-table { margin-bottom: 0; tr { > td, > th { line-height: 26px; } &:hover { td { background: $row-hover; } cursor: pointer; } &.selected { td { background: $gray-dark; border-top: 1px solid $border-gray-dark; border-bottom: 1px solid $border-gray-dark; } } } } .tree-item { .tree-item-file-name { max-width: 320px; vertical-align: middle; i, a { color: $gl-link-color; } img { position: relative; top:-1px; } } .tree_commit { max-width: 320px; } .tree_time_ago { min-width: 135px; } } .tree_author { padding-right: 8px; .commit-author-name { color: $gl-gray; } } .tree_commit { color: $gl-gray; .tree-commit-link { color: $gl-gray; &:hover { text-decoration: underline; } } } } .tree-ref-holder { float: left; margin-right: 15px; } .blob-commit-info { list-style: none; padding: $gl-padding; background: $background-color; border: 1px solid $border-color; border-bottom: none; margin: 0; .commit { padding: 0; .commit-row-title { .commit-row-message { font-weight: normal; } } } } #modal-remove-blob > .modal-dialog { width: 850px; } .blob-upload-dropzone-previews { text-align: center; border: 2px; border-style: dashed; border-color: $border-color; min-height: 200px; } .upload-link { font-weight: normal; color: $md-link-color; } .tree-controls { float: right; margin-top: 11px; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/ui_dev_kit.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/ui_dev_kit.sc0000644000175600017570000000012412672631600031014 0ustar pravipravi.gitlab-ui-dev-kit { > h2 { margin: 35px 0 20px; font-weight: bold; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/awards.scss0000644000175600017570000000440712672631600030531 0ustar pravipravi.awards { @include clearfix; line-height: 34px; .emoji-icon { width: 20px; height: 20px; margin: 7px 0 0 5px; } .award { @include border-radius(5px); border: 1px solid; padding: 0px 10px; float: left; margin-right: 5px; border-color: $border-color; cursor: pointer; &:hover { background-color: #dce0e5; } &.active { border-color: $border-gray-light; background-color: $gray-light; &:hover { background-color: #dce0e5; } .counter { font-weight: bold; } } .icon { float: left; margin-right: 10px; } .counter { float: left; } } .awards-controls { position: relative; margin-left: 10px; float: left; .add-award { font-size: 24px; color: $gl-gray; position: relative; top: 2px; &:hover, &:link { text-decoration: none; } } .emoji-menu{ position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0,0,0,.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); box-shadow: 0 6px 12px rgba(0,0,0,.175); .emoji-menu-content { padding: $gl-padding; width: 300px; height: 300px; overflow-y: scroll; h5 { clear: left; } ul { list-style-type: none; margin-left: -20px; margin-bottom: 20px; overflow: auto; } input.emoji-search{ background: image-url("icon-search.png") 240px no-repeat; } li { cursor: pointer; width: 30px; height: 30px; text-align: center; float: left; margin: 3px; list-decorate: none; @include border-radius(5px); &:hover { background-color: #ccc; } } } } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/todos.scss0000644000175600017570000000354412672631600030401 0ustar pravipravi/** * Dashboard Todos * */ .navbar-nav { li { .badge.todos-pending-count { background-color: #7f8fa4; margin-top: -5px; } } } .todos { .panel { border-top: none; margin-bottom: 0; } } .todo-item { font-size: $gl-font-size; padding: $gl-padding-top 0 $gl-padding-top ($gl-avatar-size + $gl-padding-top); border-bottom: 1px solid $table-border-color; color: #7f8fa4; &.todo-inline { .avatar { position: relative; top: -2px; } .todo-title { line-height: 40px; } } a { color: #4c4e54; } .avatar { margin-left: -($gl-avatar-size + $gl-padding-top); } .todo-title { @include str-truncated(calc(100% - 174px)); font-weight: 600; .author_name { color: #333; } } .todo-body { margin-right: 174px; .todo-note { word-wrap: break-word; .md { color: #7f8fa4; font-size: $gl-font-size; p { color: #5c5d5e; } } pre { border: none; background: #f9f9f9; border-radius: 0; color: #777; margin: 0 20px; overflow: hidden; } .note-image-attach { margin-top: 4px; margin-left: 0px; max-width: 200px; float: none; } p:last-child { margin-bottom: 0; } } .todo-note-icon { color: #777; float: left; font-size: $gl-font-size; line-height: 16px; margin-right: 5px; } } &:last-child { border:none } } @media (max-width: $screen-xs-max) { .todo-item { padding-left: $gl-padding; .todo-title { white-space: normal; overflow: visible; max-width: 100%; } .avatar { display: none; } .todo-body { margin: 0; border-left: 2px solid #DDD; padding-left: 10px; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/projects.scss0000644000175600017570000001770012672631600031101 0ustar pravipravi.alert_holder { margin: -16px; .alert-link { font-weight: normal; } } .no-ssh-key-message, .project-limit-message { background-color: #f28d35; margin-bottom: 16px; } .new_project, .edit_project { fieldset.features { .control-label { font-weight: normal; } } } .project-name-holder { .help-inline { vertical-align: top; padding: 7px; } } .project-home-panel { padding-bottom: 40px; border-bottom: 1px solid $border-color; .cover-controls { .project-settings-dropdown { margin-left: 10px; } } .project-identicon-holder { margin-bottom: 16px; .avatar, .identicon { margin: 0 auto; float: none; } .identicon { @include border-radius(50%); } } .project-home-dropdown { margin: 13px 0px 0; } .notifications-btn { margin-top: -28px; .fa-bell { margin-right: 6px; } .fa-angle-down { margin-left: 6px; } } .project-home-desc { h1 { color: #313236; margin: 0; margin-bottom: 6px; font-size: 23px; font-weight: normal; } .visibility-icon { display: inline-block; margin-left: 5px; font-size: 18px; color: $gray; } p { padding: 0 $gl-padding; color: #5c5d5e; } } .project-repo-buttons { margin-top: 20px; margin-bottom: 0px; .count-buttons { display: block; margin-bottom: 20px; } .clone-row { .split-repo-buttons, .project-clone-holder { display: inline-block; } .split-repo-buttons { margin: 0 12px; } } .btn { @include btn-gray; text-transform: none; } .count-with-arrow { display: inline-block; position: relative; margin-left: 4px; .arrow { &:before { content: ''; display: inline-block; position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; top: 50%; left: 0; margin-top: -6px; border-width: 7px 5px 7px 0; border-right-color: #dce0e5; } &:after { content: ''; position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; top: 50%; left: 1px; margin-top: -9px; border-width: 10px 7px 10px 0; border-right-color: #FFF; } } .count { @include btn-gray; display: inline-block; background: white; border-radius: 2px; border-width: 1px; border-style: solid; font-size: 13px; font-weight: 600; line-height: 13px; padding: $gl-vert-padding $gl-padding; letter-spacing: .4px; padding: 10px 14px; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; white-space: nowrap; margin: 0 11px 0px 4px; &:hover { background: #FFF; } } } } } .split-one { display: inline-table; margin-right: 12px; a { margin: -1px !important; } } .dropdown-menu { @include box-shadow(rgba(76, 86, 103, 0.247059) 0px 0px 1px 0px, rgba(31, 37, 50, 0.317647) 0px 2px 18px 0px); @include border-radius (0px); border: none; padding: 16px 0; font-size: 14px; font-weight: 100; li a { color: #5f697a; line-height: 30px; &:hover { background-color: #3084bb !important; } } i { margin-right: 8px; } } .project-visibility-level-holder { .radio { margin-bottom: 10px; i { margin: 2px 0; font-size: 20px; } .option-title { font-weight: normal; display: inline-block; color: #313236; } .option-descr { margin-left: 29px; color: #54565b; } } } .save-project-loader { margin-top: 50px; margin-bottom: 50px; color: #555; } .project_member_row form { margin: 0px; } .transfer-project .select2-container { min-width: 200px; } .deploy-project-label { margin: 1px; } .vs-public { color: $gl-primary; } .vs-internal { color: $gl-warning; } .vs-private { color: $gl-success; } .breadcrumb.repo-breadcrumb { padding: 0; background: transparent; border: none; line-height: 42px; margin: 0; > li + li:before { padding: 0 3px; color: #999; } } .last-push-widget { margin-top: -1px; } .fork-namespaces { .fork-thumbnail { text-align: center; margin-bottom: $gl-padding; .caption { padding: $gl-padding 0; min-height: 30px; } img { @include border-radius(50%); max-width: 100px; } } } table.table.protected-branches-list tr.no-border { th, td { border: 0; } } .project-import .btn { float: left; margin-right: 10px; } .project-stats { text-align: center; margin-top: $gl-padding; margin-bottom: 0; padding-top: 10px; padding-bottom: 4px; ul.nav { display:inline-block; } .nav li { display:inline; } .nav > li > a { @include btn-default; @include btn-gray; background-color: transparent; border: 1px solid #f7f8fa; margin-left: 12px; } li { display:inline; } a { float:left; font-size: 17px; } li.missing a { color: #5a6069; border: 1px dashed #dce0e5; &:hover { background-color: #f0f2f5; } } } pre.light-well { border-color: #f1f1f1; } .git-empty { margin: 0 7px 0 7px; h5 { color: #5c5d5e; } .light-well { @include border-radius (2px); color: #5b6169; font-size: 13px; line-height: 1.6em; } } .project-footer { margin-top: 20px; .btn-remove { @include btn-middle; @include btn-red; float: left !important; } } /* * Projects list rendered on dashboard and user page */ .projects-list { @include basic-list; .project-row { border-color: $table-border-color; &.no-description { .project { line-height: 40px; } } .project-full-name { @include str-truncated; font-weight: 600; color: #4c4e54; } .project-controls { float: right; color: $gl-gray; line-height: 40px; color: #7f8fa4; a:hover { text-decoration: none; } > span { margin-left: 10px; } } .project-description { color: #7f8fa4; p { @include str-truncated; margin-bottom: 0; color: #7f8fa4; } } } .bottom { padding-top: $gl-padding; padding-bottom: 0; } } .panel .projects-list li { padding: 10px 15px; margin: 0; } .project-show-activity { .activity-filter-block { margin-top: -1px; } } .project-last-commit { .ci-status { margin-right: 16px; } .commit-row-message { color: $gl-gray; } .commit_short_id { margin-right: 5px; color: $gl-link-color; font-weight: 600; } .commit-author-link { margin-left: 7px; text-decoration: none; .avatar { float: none; margin-right: 4px; } .commit-author-name { font-weight: 600; } } } .project-show-readme .readme-holder { padding: $gl-padding 0; border-top: 0; .edit-project-readme { z-index: 100; position: relative; } } .git-clone-holder { width: 498px; .btn-clipboard { border: 1px solid $border-color; padding: 6px $gl-padding; } .project-home-dropdown + & { margin-right: 45px; } .clone-options { display: table-cell; a.btn { width: 100%; } } .form-control { @extend .monospace; background: #FFF; font-size: 14px; margin-left: -1px; cursor: auto; width: 101%; } } .cannot-be-merged, .cannot-be-merged:hover { color: #E62958; margin-top: 2px; } .private-forks-notice .private-fork-icon { i:nth-child(1) { color: #2AA056; } i:nth-child(2) { color: #FFFFFF; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/issues.scss0000644000175600017570000000366012672631600030563 0ustar pravipravi.issues-list { .issue { padding: 10px $gl-padding; position: relative; .issue-title { margin-bottom: 5px; font-size: $list-font-size; font-weight: 600; } .issue-info { color: $gl-gray; } .issue-check { float: left; padding-right: 8px; margin-bottom: 10px; min-width: 15px; } .issue-labels { display: inline-block; } .issue-no-comments { opacity: 0.5; } } } .check-all-holder { line-height: 36px; float: left; margin-right: 15px; } .issues_content { .title { height: 40px; } form { margin: 0; } } .issue-search-form { margin: 0; height: 24px; } form.edit-issue { margin: 0; } .merge-requests-title { font-size: 16px; font-weight: 600; } .merge-request-id { display: inline-block; width: 3em; } .merge-request-status { color: $gl-gray; font-size: 15px; font-weight: bold; } .merge-request, .issue { &.today { background: #EFE; border-color: #CEC; } &.closed { background: #F9F9F9; border-color: #E5E5E5; } &.merged { background: #F9F9F9; border-color: #E5E5E5; } } @media (max-width: $screen-xs-max) { .issue-btn-group { width: 100%; margin-top: 5px; .btn-group { width: 100%; ul { width: 100%; text-align: center; } } .btn { width: 100%; margin-top: -1px; &:first-child:not(:last-child) { border-radius: 4px 4px 0 0; } &:not(:first-child):not(:last-child) { border-radius: 0; } &:last-child:not(:first-child) { border-radius: 0 0 4px 4px; } } } .issue { &:hover .issue-actions { display: none !important; } .issue-updated-at { display: none; } } } .issue-form .select2-container { width: 250px !important; } .issue-closed-by-widget { color: $secondary-text; margin-left: 52px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/events.scss0000644000175600017570000000543212672631600030553 0ustar pravipravi/** * Dashboard events feed * */ .event-item { font-size: $gl-font-size; padding: $gl-padding-top 0 $gl-padding-top ($gl-avatar-size + $gl-padding-top); border-bottom: 1px solid $table-border-color; color: #7f8fa4; &.event-inline { .avatar { position: relative; top: -2px; } .event-title, .event-item-timestamp { line-height: 40px; } } a { color: #4c4e54; } .avatar { margin-left: -($gl-avatar-size + $gl-padding-top); } .event-title { @include str-truncated(calc(100% - 174px)); font-weight: 600; .author_name { color: #333; } } .event-body { margin-right: 174px; .event-note { word-wrap: break-word; .md { color: #7f8fa4; font-size: $gl-font-size; iframe.twitter-share-button { vertical-align: bottom; } } pre { border: none; background: #f9f9f9; border-radius: 0; color: #777; margin: 0 20px; overflow: hidden; } .note-image-attach { margin-top: 4px; margin-left: 0px; max-width: 200px; float: none; } p:last-child { margin-bottom: 0; } } .event-note-icon { color: #777; float: left; font-size: $gl-font-size; line-height: 16px; margin-right: 5px; } } .event_icon { position: relative; float: right; border: 1px solid #EEE; padding: 5px; @include border-radius(5px); background: #F9F9F9; margin-left: 10px; top: -6px; img { width: 20px; } } &:last-child { border:none } .event_commits { li { &.commit { background: transparent; padding: 3px; padding-left: 0; border: none; .commit-row-title { font-size: $gl-font-size; } } &.commits-stat { margin-top: 3px; display: block; padding: 3px; padding-left: 0; &:hover { background: none; } } } } .event-item-timestamp { float: right; line-height: 22px; } } /* * Last push widget */ .event-last-push { overflow: auto; width: 100%; .event-last-push-text { @include str-truncated(100%); padding: 5px 0; font-size: 13px; float:left; margin-right: -150px; padding-right: 150px; line-height: 20px; } } @media (max-width: $screen-xs-max) { .event-item { padding-left: $gl-padding; .event-title { white-space: normal; overflow: visible; max-width: 100%; } .avatar { display: none; } .event-body { margin: 0; border-left: 2px solid #DDD; padding-left: 10px; } .event-item-timestamp { display: none; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/sherlock.scss0000644000175600017570000000073512672631600031062 0ustar pravipravitable .sherlock-code { max-width: 700px; } .sherlock-code { pre { word-wrap: normal; } pre code { white-space: pre; } } .sherlock-line-samples-table { margin-bottom: 0px !important; thead tr th, tbody tr td { font-size: 13px !important; text-align: right; padding: 0px 10px !important; } } .sherlock-file-sample pre { padding-top: 28px !important; } .sherlock-line-samples-table .slow { color: $red-light; font-weight: bold; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/help.scss0000644000175600017570000000167312672631600030202 0ustar pravipravi.documentation-index { h1 { margin: 0; } h2 { font-size: 20px; } li { line-height: 24px; color: #888; a { margin-right: 3px; } } } .shortcut-mappings { font-size: 12px; color: #555; tbody:first-child tr:first-child { padding-top: 0 } th { padding-top: 15px; line-height: 1.5; color: #333; text-align: left } td { padding-top: 3px; padding-bottom: 3px; vertical-align: top; line-height: 20px } .shortcut { padding-right: 10px; color: #999; text-align: right; white-space: nowrap } .key { @extend .label; @extend .label-inverse; font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 3px 5px; } } .modal-body { position: relative; overflow-y: auto; padding: 15px; } body.modal-open { overflow: hidden; } .modal .modal-dialog { width: 860px; } .documentation { padding: 7px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/snippets.scss0000644000175600017570000000136312672631600031113 0ustar pravipravi.snippet-form-holder .file-holder .file-title { padding: 2px; } .snippet-row { .snippet-title { font-size: 15px; font-weight: bold; line-height: 20px; margin-bottom: 2px; .monospace { font-weight: normal; } } .snippet-info { color: #888; font-size: 13px; line-height: 24px; a { color: #888; } } } .snippet-holder { margin-bottom: -$gl-padding; .file-holder { border-top: 0; } .file-actions { .btn-clipboard { @extend .btn; } } } .snippet-box { @include border-radius(2px); display: block; float: left; padding: 0 $gl-padding; font-weight: normal; margin-right: 10px; font-size: $gl-font-size; border: 1px solid; line-height: 40px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/errors.scss0000644000175600017570000000026112672631600030556 0ustar pravipravi.error-page { max-width: 400px; margin: 0 auto; h1, h2, h3 { text-align: center; } h1 { font-size: 56px; line-height: 100px; font-weight: 300; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/labels.scss0000644000175600017570000000042412672631600030505 0ustar pravipravi.suggest-colors { margin-top: 5px; a { @include border-radius(4px); width: 30px; height: 30px; display: inline-block; margin-right: 10px; } } .label-row { .label { padding: 9px; font-size: 14px; } } .color-label { padding: 3px 4px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/profile.scss0000644000175600017570000000165612672631600030713 0ustar pravipravi.account-page { fieldset { margin-bottom: 15px; padding-bottom: 15px; } } .profile-avatar-form-option { hr { margin: 10px 0; } } .oauth-buttons { .btn-group { margin-right: 10px; } .btn { line-height: 40px; height: 42px; padding: 0px 12px; img { width: 32px; height: 32px; } } } // Profile > Account > Two Factor Authentication .two-factor-new { .manual-instructions { h3 { margin-top: 0; } // Slightly increase the size of the details so they're easier to read dl { font-size: 1.1em; } } } .calendar-hint { margin-top: -12px; float: right; font-size: 12px; } .profile-link-holder { display: inline; &:after { content: "\00B7"; padding: 0px 6px; font-weight: bold; } &:last-child { &:after { content: ""; padding: 0; } } a { color: $blue-dark; text-decoration: none; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/notes.scss0000644000175600017570000000777712672631600030415 0ustar pravipravi/** * Notes */ @-webkit-keyframes targe3-note { from { background:#fffff0; } 50% { background:#ffffd3; } to { background:#fffff0; } } ul.notes { display: block; list-style: none; margin: 0px; padding: 0px; .system-note { font-size: 14px; padding-top: 10px; padding-bottom: 10px; background: #FDFDFD; .timeline-icon { .avatar { visibility: hidden; } } } .discussion-header, .note-header { @extend .cgray; a:hover { text-decoration: none; } .avatar { float: left; margin-right: 10px; } .discussion-last-update, .note-last-update { &:before { content: "\00b7"; } a { color: $gl-gray; &:hover { text-decoration: underline; } } } .author { color: #4c4e54; margin-right: 3px; &:hover { color: $gl-link-color; } } .author-username { } .note-role { float: right; margin-top: 1px; border: 1px solid #bbb; background-color: transparent; color: $gl-gray; } } .discussion-body { padding-top: 15px; } .discussion { overflow: hidden; display: block; position:relative; } .note { display: block; position:relative; .note-body { overflow: auto; .note-text { overflow: auto; word-wrap: break-word; @include md-typography; // Reset ul style types since we're nested inside a ul already & > ul { list-style-type: disc; ul { list-style-type: circle; ul { list-style-type: square; } } } ul.task-list { ul:not(.task-list) { padding-left: 1.3em; } } hr { // Darken 'whitesmoke' a bit to make it more visible in note bodies border-color: darken(#F5F5F5, 8%); margin: 10px 0; } } } .note-header { padding-bottom: 3px; } &:last-child { border-bottom: 1px solid $border-color; } } } // Diff code in discussion view .discussion-body .diff-file { .diff-header > span { margin-right: 10px; } .line_content { white-space: pre-wrap; } } .diff-file .notes_holder { font-family: $regular_font; td { border: 1px solid #ddd; border-left: none; &.notes_line { text-align: center; padding: 10px 0; background: #FFF; color: $text-color; } &.notes_line2 { text-align: center; padding: 10px 0; border-left: 1px solid #ddd !important; } &.notes_content { background-color: #fff; border-width: 1px 0; padding-top: 0; vertical-align: top; &.parallel{ border-width: 1px; } } } } /** * Actions for Discussions/Notes */ .discussion, .note { .discussion-actions, .note-actions { float: right; margin-left: 10px; a { margin-left: 5px; color: $gl-gray; i.fa { font-size: 16px; line-height: 16px; } &:hover { @extend .cgray; &.danger { @extend .cred; } } } } } .diff-file .note .note-actions { right: 0; top: 0; } /** * Line note button on the side of diffs */ .diff-file tr.line_holder { @mixin show-add-diff-note { filter: alpha(opacity=100); opacity: 1.0; } .add-diff-note { margin-top: -4px; @include border-radius(40px); background: #FFF; padding: 4px; font-size: 16px; color: $gl-link-color; margin-left: -60px; position: absolute; z-index: 10; width: 32px; transition: all 0.2s ease; // "hide" it by default opacity: 0.0; filter: alpha(opacity=0); &:hover { background: $gl-info; color: #FFF; @include show-add-diff-note; } } // "show" the icon also if we just hover somewhere over the line &:hover > td { .add-diff-note { @include show-add-diff-note; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/groups.scss0000644000175600017570000000107512672631600030565 0ustar pravipravi.member-search-form { float: left; input[type='search'] { width: 225px; vertical-align: bottom; @media (max-width: $screen-xs-max) { width: 100px; vertical-align: bottom; } } } .milestone-row { @include str-truncated(90%); } .dashboard .side .panel .panel-heading .input-group { .form-control { height: 42px; } } .group-row { &.no-description { .group-name { line-height: 44px; } } .stats { float: right; line-height: 44px; color: $gl-gray; span { margin-right: 15px; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/xterm.scss0000644000175600017570000003150512672631600030406 0ustar pravipravi.build-page { // color codes are based on http://en.wikipedia.org/wiki/File:Xterm_256color_chart.svg // see also: https://gist.github.com/jasonm23/2868981 $black: #000000; $red: #cd0000; $green: #00cd00; $yellow: #cdcd00; $blue: #0000ee; // according to wikipedia, this is the xterm standard //$blue: #1e90ff; // this is used by all the terminals I tried (when configured with the xterm color profile) $magenta: #cd00cd; $cyan: #00cdcd; $white: #e5e5e5; $l-black: #7f7f7f; $l-red: #ff0000; $l-green: #00ff00; $l-yellow: #ffff00; $l-blue: #5c5cff; $l-magenta: #ff00ff; $l-cyan: #00ffff; $l-white: #ffffff; .term-bold { font-weight: bold; } .term-italic { font-style: italic; } .term-conceal { visibility: hidden; } .term-underline { text-decoration: underline; } .term-cross { text-decoration: line-through; } .term-fg-black { color: $black; } .term-fg-red { color: $red; } .term-fg-green { color: $green; } .term-fg-yellow { color: $yellow; } .term-fg-blue { color: $blue; } .term-fg-magenta { color: $magenta; } .term-fg-cyan { color: $cyan; } .term-fg-white { color: $white; } .term-fg-l-black { color: $l-black; } .term-fg-l-red { color: $l-red; } .term-fg-l-green { color: $l-green; } .term-fg-l-yellow { color: $l-yellow; } .term-fg-l-blue { color: $l-blue; } .term-fg-l-magenta { color: $l-magenta; } .term-fg-l-cyan { color: $l-cyan; } .term-fg-l-white { color: $l-white; } .term-bg-black { background-color: $black; } .term-bg-red { background-color: $red; } .term-bg-green { background-color: $green; } .term-bg-yellow { background-color: $yellow; } .term-bg-blue { background-color: $blue; } .term-bg-magenta { background-color: $magenta; } .term-bg-cyan { background-color: $cyan; } .term-bg-white { background-color: $white; } .term-bg-l-black { background-color: $l-black; } .term-bg-l-red { background-color: $l-red; } .term-bg-l-green { background-color: $l-green; } .term-bg-l-yellow { background-color: $l-yellow; } .term-bg-l-blue { background-color: $l-blue; } .term-bg-l-magenta { background-color: $l-magenta; } .term-bg-l-cyan { background-color: $l-cyan; } .term-bg-l-white { background-color: $l-white; } .xterm-fg-0 { color: #000000; } .xterm-fg-1 { color: #800000; } .xterm-fg-2 { color: #008000; } .xterm-fg-3 { color: #808000; } .xterm-fg-4 { color: #000080; } .xterm-fg-5 { color: #800080; } .xterm-fg-6 { color: #008080; } .xterm-fg-7 { color: #c0c0c0; } .xterm-fg-8 { color: #808080; } .xterm-fg-9 { color: #ff0000; } .xterm-fg-10 { color: #00ff00; } .xterm-fg-11 { color: #ffff00; } .xterm-fg-12 { color: #0000ff; } .xterm-fg-13 { color: #ff00ff; } .xterm-fg-14 { color: #00ffff; } .xterm-fg-15 { color: #ffffff; } .xterm-fg-16 { color: #000000; } .xterm-fg-17 { color: #00005f; } .xterm-fg-18 { color: #000087; } .xterm-fg-19 { color: #0000af; } .xterm-fg-20 { color: #0000d7; } .xterm-fg-21 { color: #0000ff; } .xterm-fg-22 { color: #005f00; } .xterm-fg-23 { color: #005f5f; } .xterm-fg-24 { color: #005f87; } .xterm-fg-25 { color: #005faf; } .xterm-fg-26 { color: #005fd7; } .xterm-fg-27 { color: #005fff; } .xterm-fg-28 { color: #008700; } .xterm-fg-29 { color: #00875f; } .xterm-fg-30 { color: #008787; } .xterm-fg-31 { color: #0087af; } .xterm-fg-32 { color: #0087d7; } .xterm-fg-33 { color: #0087ff; } .xterm-fg-34 { color: #00af00; } .xterm-fg-35 { color: #00af5f; } .xterm-fg-36 { color: #00af87; } .xterm-fg-37 { color: #00afaf; } .xterm-fg-38 { color: #00afd7; } .xterm-fg-39 { color: #00afff; } .xterm-fg-40 { color: #00d700; } .xterm-fg-41 { color: #00d75f; } .xterm-fg-42 { color: #00d787; } .xterm-fg-43 { color: #00d7af; } .xterm-fg-44 { color: #00d7d7; } .xterm-fg-45 { color: #00d7ff; } .xterm-fg-46 { color: #00ff00; } .xterm-fg-47 { color: #00ff5f; } .xterm-fg-48 { color: #00ff87; } .xterm-fg-49 { color: #00ffaf; } .xterm-fg-50 { color: #00ffd7; } .xterm-fg-51 { color: #00ffff; } .xterm-fg-52 { color: #5f0000; } .xterm-fg-53 { color: #5f005f; } .xterm-fg-54 { color: #5f0087; } .xterm-fg-55 { color: #5f00af; } .xterm-fg-56 { color: #5f00d7; } .xterm-fg-57 { color: #5f00ff; } .xterm-fg-58 { color: #5f5f00; } .xterm-fg-59 { color: #5f5f5f; } .xterm-fg-60 { color: #5f5f87; } .xterm-fg-61 { color: #5f5faf; } .xterm-fg-62 { color: #5f5fd7; } .xterm-fg-63 { color: #5f5fff; } .xterm-fg-64 { color: #5f8700; } .xterm-fg-65 { color: #5f875f; } .xterm-fg-66 { color: #5f8787; } .xterm-fg-67 { color: #5f87af; } .xterm-fg-68 { color: #5f87d7; } .xterm-fg-69 { color: #5f87ff; } .xterm-fg-70 { color: #5faf00; } .xterm-fg-71 { color: #5faf5f; } .xterm-fg-72 { color: #5faf87; } .xterm-fg-73 { color: #5fafaf; } .xterm-fg-74 { color: #5fafd7; } .xterm-fg-75 { color: #5fafff; } .xterm-fg-76 { color: #5fd700; } .xterm-fg-77 { color: #5fd75f; } .xterm-fg-78 { color: #5fd787; } .xterm-fg-79 { color: #5fd7af; } .xterm-fg-80 { color: #5fd7d7; } .xterm-fg-81 { color: #5fd7ff; } .xterm-fg-82 { color: #5fff00; } .xterm-fg-83 { color: #5fff5f; } .xterm-fg-84 { color: #5fff87; } .xterm-fg-85 { color: #5fffaf; } .xterm-fg-86 { color: #5fffd7; } .xterm-fg-87 { color: #5fffff; } .xterm-fg-88 { color: #870000; } .xterm-fg-89 { color: #87005f; } .xterm-fg-90 { color: #870087; } .xterm-fg-91 { color: #8700af; } .xterm-fg-92 { color: #8700d7; } .xterm-fg-93 { color: #8700ff; } .xterm-fg-94 { color: #875f00; } .xterm-fg-95 { color: #875f5f; } .xterm-fg-96 { color: #875f87; } .xterm-fg-97 { color: #875faf; } .xterm-fg-98 { color: #875fd7; } .xterm-fg-99 { color: #875fff; } .xterm-fg-100 { color: #878700; } .xterm-fg-101 { color: #87875f; } .xterm-fg-102 { color: #878787; } .xterm-fg-103 { color: #8787af; } .xterm-fg-104 { color: #8787d7; } .xterm-fg-105 { color: #8787ff; } .xterm-fg-106 { color: #87af00; } .xterm-fg-107 { color: #87af5f; } .xterm-fg-108 { color: #87af87; } .xterm-fg-109 { color: #87afaf; } .xterm-fg-110 { color: #87afd7; } .xterm-fg-111 { color: #87afff; } .xterm-fg-112 { color: #87d700; } .xterm-fg-113 { color: #87d75f; } .xterm-fg-114 { color: #87d787; } .xterm-fg-115 { color: #87d7af; } .xterm-fg-116 { color: #87d7d7; } .xterm-fg-117 { color: #87d7ff; } .xterm-fg-118 { color: #87ff00; } .xterm-fg-119 { color: #87ff5f; } .xterm-fg-120 { color: #87ff87; } .xterm-fg-121 { color: #87ffaf; } .xterm-fg-122 { color: #87ffd7; } .xterm-fg-123 { color: #87ffff; } .xterm-fg-124 { color: #af0000; } .xterm-fg-125 { color: #af005f; } .xterm-fg-126 { color: #af0087; } .xterm-fg-127 { color: #af00af; } .xterm-fg-128 { color: #af00d7; } .xterm-fg-129 { color: #af00ff; } .xterm-fg-130 { color: #af5f00; } .xterm-fg-131 { color: #af5f5f; } .xterm-fg-132 { color: #af5f87; } .xterm-fg-133 { color: #af5faf; } .xterm-fg-134 { color: #af5fd7; } .xterm-fg-135 { color: #af5fff; } .xterm-fg-136 { color: #af8700; } .xterm-fg-137 { color: #af875f; } .xterm-fg-138 { color: #af8787; } .xterm-fg-139 { color: #af87af; } .xterm-fg-140 { color: #af87d7; } .xterm-fg-141 { color: #af87ff; } .xterm-fg-142 { color: #afaf00; } .xterm-fg-143 { color: #afaf5f; } .xterm-fg-144 { color: #afaf87; } .xterm-fg-145 { color: #afafaf; } .xterm-fg-146 { color: #afafd7; } .xterm-fg-147 { color: #afafff; } .xterm-fg-148 { color: #afd700; } .xterm-fg-149 { color: #afd75f; } .xterm-fg-150 { color: #afd787; } .xterm-fg-151 { color: #afd7af; } .xterm-fg-152 { color: #afd7d7; } .xterm-fg-153 { color: #afd7ff; } .xterm-fg-154 { color: #afff00; } .xterm-fg-155 { color: #afff5f; } .xterm-fg-156 { color: #afff87; } .xterm-fg-157 { color: #afffaf; } .xterm-fg-158 { color: #afffd7; } .xterm-fg-159 { color: #afffff; } .xterm-fg-160 { color: #d70000; } .xterm-fg-161 { color: #d7005f; } .xterm-fg-162 { color: #d70087; } .xterm-fg-163 { color: #d700af; } .xterm-fg-164 { color: #d700d7; } .xterm-fg-165 { color: #d700ff; } .xterm-fg-166 { color: #d75f00; } .xterm-fg-167 { color: #d75f5f; } .xterm-fg-168 { color: #d75f87; } .xterm-fg-169 { color: #d75faf; } .xterm-fg-170 { color: #d75fd7; } .xterm-fg-171 { color: #d75fff; } .xterm-fg-172 { color: #d78700; } .xterm-fg-173 { color: #d7875f; } .xterm-fg-174 { color: #d78787; } .xterm-fg-175 { color: #d787af; } .xterm-fg-176 { color: #d787d7; } .xterm-fg-177 { color: #d787ff; } .xterm-fg-178 { color: #d7af00; } .xterm-fg-179 { color: #d7af5f; } .xterm-fg-180 { color: #d7af87; } .xterm-fg-181 { color: #d7afaf; } .xterm-fg-182 { color: #d7afd7; } .xterm-fg-183 { color: #d7afff; } .xterm-fg-184 { color: #d7d700; } .xterm-fg-185 { color: #d7d75f; } .xterm-fg-186 { color: #d7d787; } .xterm-fg-187 { color: #d7d7af; } .xterm-fg-188 { color: #d7d7d7; } .xterm-fg-189 { color: #d7d7ff; } .xterm-fg-190 { color: #d7ff00; } .xterm-fg-191 { color: #d7ff5f; } .xterm-fg-192 { color: #d7ff87; } .xterm-fg-193 { color: #d7ffaf; } .xterm-fg-194 { color: #d7ffd7; } .xterm-fg-195 { color: #d7ffff; } .xterm-fg-196 { color: #ff0000; } .xterm-fg-197 { color: #ff005f; } .xterm-fg-198 { color: #ff0087; } .xterm-fg-199 { color: #ff00af; } .xterm-fg-200 { color: #ff00d7; } .xterm-fg-201 { color: #ff00ff; } .xterm-fg-202 { color: #ff5f00; } .xterm-fg-203 { color: #ff5f5f; } .xterm-fg-204 { color: #ff5f87; } .xterm-fg-205 { color: #ff5faf; } .xterm-fg-206 { color: #ff5fd7; } .xterm-fg-207 { color: #ff5fff; } .xterm-fg-208 { color: #ff8700; } .xterm-fg-209 { color: #ff875f; } .xterm-fg-210 { color: #ff8787; } .xterm-fg-211 { color: #ff87af; } .xterm-fg-212 { color: #ff87d7; } .xterm-fg-213 { color: #ff87ff; } .xterm-fg-214 { color: #ffaf00; } .xterm-fg-215 { color: #ffaf5f; } .xterm-fg-216 { color: #ffaf87; } .xterm-fg-217 { color: #ffafaf; } .xterm-fg-218 { color: #ffafd7; } .xterm-fg-219 { color: #ffafff; } .xterm-fg-220 { color: #ffd700; } .xterm-fg-221 { color: #ffd75f; } .xterm-fg-222 { color: #ffd787; } .xterm-fg-223 { color: #ffd7af; } .xterm-fg-224 { color: #ffd7d7; } .xterm-fg-225 { color: #ffd7ff; } .xterm-fg-226 { color: #ffff00; } .xterm-fg-227 { color: #ffff5f; } .xterm-fg-228 { color: #ffff87; } .xterm-fg-229 { color: #ffffaf; } .xterm-fg-230 { color: #ffffd7; } .xterm-fg-231 { color: #ffffff; } .xterm-fg-232 { color: #080808; } .xterm-fg-233 { color: #121212; } .xterm-fg-234 { color: #1c1c1c; } .xterm-fg-235 { color: #262626; } .xterm-fg-236 { color: #303030; } .xterm-fg-237 { color: #3a3a3a; } .xterm-fg-238 { color: #444444; } .xterm-fg-239 { color: #4e4e4e; } .xterm-fg-240 { color: #585858; } .xterm-fg-241 { color: #626262; } .xterm-fg-242 { color: #6c6c6c; } .xterm-fg-243 { color: #767676; } .xterm-fg-244 { color: #808080; } .xterm-fg-245 { color: #8a8a8a; } .xterm-fg-246 { color: #949494; } .xterm-fg-247 { color: #9e9e9e; } .xterm-fg-248 { color: #a8a8a8; } .xterm-fg-249 { color: #b2b2b2; } .xterm-fg-250 { color: #bcbcbc; } .xterm-fg-251 { color: #c6c6c6; } .xterm-fg-252 { color: #d0d0d0; } .xterm-fg-253 { color: #dadada; } .xterm-fg-254 { color: #e4e4e4; } .xterm-fg-255 { color: #eeeeee; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/votes.scss0000644000175600017570000000007412672631600030404 0ustar pravipravi.votes-inline { display: inline-block; margin: 0 8px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/profiles/0000755000175600017570000000000012672631600030171 5ustar pravipravi././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/profiles/preferences.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/profiles/pref0000644000175600017570000000147212672631600031054 0ustar pravipravi.application-theme { label { margin-right: 20px; text-align: center; .preview { @include border-radius(4px); height: 80px; margin-bottom: 10px; width: 160px; &.ui_blue { background: $theme-blue; } &.ui_charcoal { background: $theme-charcoal; } &.ui_graphite { background: $theme-graphite; } &.ui_gray { background: $theme-gray; } &.ui_green { background: $theme-green; } &.ui_violet { background: $theme-violet; } } } } .syntax-theme { label { margin-right: 20px; text-align: center; .preview { margin-bottom: 10px; width: 160px; img { @include border-radius(4px); max-width: 100%; } } } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/stat_graph.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/stat_graph.sc0000644000175600017570000000125412672631600031033 0ustar pravipravi.tint-box { background: #f3f3f3; position: relative; margin-bottom: 10px; } .area { fill: #1db34f; fill-opacity: 0.5; } .axis { fill: #aaa; font-size: 10px; } #contributors { .contributors-list { margin: 0 0 10px 0; list-style: none; padding: 0; } .person { &:nth-child(even) { float: right; } float: left; margin-top: 10px; } .person .spark { display: block; background: #f3f3f3; } .person .area-contributor { fill: #f17f49; } } .selection rect { fill: #333; fill-opacity: 0.1; stroke: #333; stroke-width: 1px; stroke-opacity: 0.4; shape-rendering: crispedges; stroke-dasharray: 3 3; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/lint.scss0000644000175600017570000000021312672631600030205 0ustar pravipravi.ci-body { .incorrect-syntax{ font-size: 19px; color: red; } .correct-syntax{ font-size: 19px; color: #47a447; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/diff.scss0000644000175600017570000001551612672631600030163 0ustar pravipravi// Common .diff-file { border: 1px solid $border-color; border-top: none; .diff-header { position: relative; background: $background-color; border-bottom: 1px solid $border-color; padding: 10px 16px; color: #555; z-index: 10; .diff-title { font-family: $monospace_font; word-break: break-all; display: block; .file-mode { color: #777; } } .commit-short-id { font-family: $monospace_font; font-size: smaller; } } .diff-content { overflow: auto; overflow-y: hidden; background: #FFF; color: #333; .unfold { cursor: pointer; } .file-mode-changed { padding: 10px; color: #777; } .suppressed-container { padding: ($padding-base-vertical + 5px) $padding-base-horizontal; text-align: center; // "Changes suppressed. Click to show." link .show-suppressed-diff { font-size: 110%; font-weight: bold; } } table { width: 100%; font-family: $monospace_font; border: none; border-collapse: separate; margin: 0px; padding: 0px; .line_holder td { line-height: $code_line_height; font-size: $code_font_size; } } tr.line_holder.parallel { .old_line, .new_line { min-width: 50px; } td.line_content.parallel { width: 50%; } } .old_line, .new_line { margin: 0px; padding: 0px; border: none; padding: 0px 5px; border-right: 1px solid; text-align: right; min-width: 35px; max-width: 50px; width: 35px; @include user-select(none); a { float: left; width: 35px; font-weight: normal; &:hover { text-decoration: underline; } } } .line_content { display: block; margin: 0px; padding: 0px 0.5em; border: none; &.parallel { display: table-cell; } } } .image { background: #ddd; text-align: center; padding: 30px; .wrap { display: inline-block; } .frame { display: inline-block; background-color: #fff; line-height: 0; img { border: 1px solid #FFF; background: image-url('trans_bg.gif'); max-width: 100%; } &.deleted { border: 1px solid $deleted; } &.added { border: 1px solid $added; } } .image-info { font-size: 12px; margin: 5px 0 0 0; color: grey; } .view.swipe { position: relative; .swipe-frame { display: block; margin: auto; position: relative; } .swipe-wrap { overflow: hidden; border-left: 1px solid #999; position: absolute; display: block; top: 13px; right: 7px; } .frame { top: 0; right: 0; position: absolute; &.deleted { margin: 0; display: block; top: 13px; right: 7px; } } .swipe-bar { display: block; height: 100%; width: 15px; z-index: 100; position: absolute; cursor: pointer; &:hover { .top-handle { background-position: -15px 3px; } .bottom-handle { background-position: -15px -11px; } } .top-handle { display: block; height: 14px; width: 15px; position: absolute; top: 0px; background: image-url('swipemode_sprites.gif') 0 3px no-repeat; } .bottom-handle { display: block; height: 14px; width: 15px; position: absolute; bottom: 0px; background: image-url('swipemode_sprites.gif') 0 -11px no-repeat; } } } //.view.swipe .view.onion-skin { .onion-skin-frame { display: block; margin: auto; position: relative; } .frame.added, .frame.deleted { position: absolute; display: block; top: 0px; left: 0px; } .controls { display: block; height: 14px; width: 300px; z-index: 100; position: absolute; bottom: 0px; left: 50%; margin-left: -150px; .drag-track { display: block; position: absolute; left: 12px; height: 10px; width: 276px; background: image-url('onion_skin_sprites.gif') -4px -20px repeat-x; } .dragger { display: block; position: absolute; left: 0px; top: 0px; height: 14px; width: 14px; background: image-url('onion_skin_sprites.gif') 0px -34px repeat-x; cursor: pointer; } .transparent { display: block; position: absolute; top: 2px; right: 0px; height: 10px; width: 10px; background: image-url('onion_skin_sprites.gif') -2px 0px no-repeat; } .opaque { display: block; position: absolute; top: 2px; left: 0px; height: 10px; width: 10px; background: image-url('onion_skin_sprites.gif') -2px -10px no-repeat; } } } //.view.onion-skin } .view-modes { padding: 10px; text-align: center; background: #EEE; ul, li { list-style: none; margin: 0; padding: 0; display: inline-block; } li { color: grey; border-left: 1px solid #c1c1c1; padding: 0 12px 0 16px; cursor: pointer; &:first-child { border-left: none; } &:hover { text-decoration: underline; } &.active { &:hover { text-decoration: none; } cursor: default; color: #333; } &.disabled { display: none; } } } } .file-content .diff-file { margin: 0; border: none; } .diff-file .line_content { white-space: pre; } .diff-wrap-lines .line_content { white-space: pre-wrap; } .inline-parallel-buttons { float: right; } // Mobile @media (max-width: 480px) { .diff-title { margin: 0; .file-mode { display: none; } } .diff-controls { position: static; text-align: center; } } // Bigger screens @media (min-width: 481px) { .diff-title { margin-right: 200px; .file-mode { margin-left: 10px; } } .diff-controls { float: right; position: absolute; top: 5px; right: 15px; } } @mixin diff_background($background, $idiff, $border) { background: $background; &.line_content span.idiff { background: $idiff; } &.diff-line-num { border-color: $border; } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/detail_page.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/detail_page.s0000644000175600017570000000101512672631600030765 0ustar pravipravi.detail-page-header { padding: 11px 0; border-bottom: 1px solid $border-color; color: #5c5d5e; font-size: 16px; line-height: 34px; .author { color: #5c5d5e; } .identifier { color: #5c5d5e; } .issue_created_ago, .author_link { white-space: nowrap; } .issue-meta { margin-left: 65px } } .detail-page-description { .title { margin: 0; font-size: 23px; color: #313236; } .description { margin-top: 6px; p:last-child { margin-bottom: 0; } } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/appearances.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/appearances.s0000644000175600017570000000031712672631600031015 0ustar pravipravi.appearance-logo-preview { max-width: 400px; margin-bottom: 20px; } .appearance-light-logo-preview { background-color: $background-color; max-width: 72px; padding: 10px; margin-bottom: 10px; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/note_form.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/note_form.scs0000644000175600017570000000435612672631600031060 0ustar pravipravi/** * Note Form */ .comment-btn { @extend .btn-create; } .reply-btn { @extend .btn-primary; margin: 10px $gl-padding; } .diff-file .diff-content { tr.line_holder:hover > td .line_note_link { opacity: 1.0; filter: alpha(opacity=100); } } .diff-file, .discussion { .new_note { margin: 0; border: none; } } .new_note { display: none; } .new_note, .edit_note { .note-form-actions { margin-top: $gl-padding; } .note-preview-holder { > p { overflow-x: auto; } } img { max-width: 100%; } .note_text { width: 100%; } .comment-hints { margin-top: -12px; } } /* loading indicator */ .notes-busy { margin: 18px; } .note-image-attach { @extend .col-md-4; margin-left: 45px; float: none; } .common-note-form { margin: 0; background: #fff; padding: $gl-padding; margin-left: -$gl-padding; margin-right: -$gl-padding; margin-bottom: -$gl-padding; } .note-form-actions { background: #fff; .note-form-option { margin-top: 8px; margin-left: 30px; @extend .pull-left; } .js-notify-commit-author { float: left; } .write-preview-btn { // makes the "absolute" position for links relative to this position: relative; // preview/edit buttons > a { position: absolute; right: 5px; top: 8px; } } } .note-edit-form { display: none; font-size: 15px; .form-actions { padding-left: 20px; .btn-save { float: left; } .note-form-option { float: left; padding: 2px 0 0 25px; } } } .js-note-attachment-delete { display: none; } .parallel-comment { padding: 6px; } .error-alert > .alert { margin-top: 5px; margin-bottom: 5px; } .discussion-body, .diff-file { .notes .note { border-color: #ddd; padding: 10px 15px; } .discussion-reply-holder { background: $background-color; border-top: 1px solid $border-color; } } .discussion-notes-count { font-size: 16px; } .edit_note { .markdown-area { min-height: 140px; max-height: 500px; } .note-form-actions { background: transparent; } } .comment-hints { color: #999; background: #FFF; padding: 7px; margin-top: -7px; border: 1px solid $border-color; font-size: 13px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/status.scss0000644000175600017570000000154512672631600030573 0ustar pravipravi.ci-status { padding: 2px 7px; margin-right: 5px; border: 1px solid #EEE; white-space: nowrap; @include border-radius(4px); &:hover { text-decoration: none; } &.ci-failed { color: $gl-danger; border-color: $gl-danger; } &.ci-success { color: $gl-success; border-color: $gl-success; } &.ci-info { color: $gl-info; border-color: $gl-info; } &.ci-disabled { color: $gl-gray; border-color: $gl-gray; } &.ci-pending, &.ci-running { color: $gl-warning; border-color: $gl-warning; } } .ci-status-icon-success { @extend .cgreen; } .ci-status-icon-failed { @extend .cred; } .ci-status-icon-running, .ci-status-icon-pending { // These are standard text color } .ci-status-icon-canceled, .ci-status-icon-disabled, .ci-status-icon-not-found, .ci-status-icon-skipped { @extend .cgray; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/search.scss0000644000175600017570000000042512672631600030511 0ustar pravipravi.search-results { .search-result-row { border-bottom: 1px solid #DDD; padding-bottom: 15px; margin-bottom: 15px; } } .search-holder { max-width: 600px; margin: 0 auto; margin-bottom: 20px; input { border-color: #BBB; font-weight: bold; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/login.scss0000644000175600017570000000335312672631600030357 0ustar pravipravi/* Login Page */ .login-page { .container { max-width: 960px; } .navbar-gitlab .container { max-width: none; } .brand-holder { font-size: 18px; line-height: 1.5; p { color: #888; } h1:first-child { font-weight: normal; margin-bottom: 30px; margin-top: 0; } img { max-width: 100%; margin-bottom: 30px; } a { font-weight: bold; } } .login-box{ background: #fafafa; border-radius: 10px; box-shadow: 0 0px 2px #CCC; padding: 15px; .login-heading h3 { font-weight: 300; line-height: 1.5; margin: 0 0 10px 0; } .login-footer { margin-top: 10px; p:last-child { margin-bottom: 0; } } a.forgot { float: right; padding-top: 6px } .nav .active a { background: transparent; } } .form-control { font-size: 14px; padding: 10px 8px; width: 100%; height: auto; &.top { @include border-radius(5px 5px 0 0); margin-bottom: 0px; } &.bottom { @include border-radius(0 0 5px 5px); border-top: 0; margin-bottom: 20px; } &.middle { border-top: 0; margin-bottom:0px; @include border-radius(0); } &:active, &:focus { background-color: #FFF; } } .devise-errors { h2 { margin-top: 0; font-size: 14px; color: #a00; } } .remember-me { margin-top: -10px; label { font-weight: normal; } } } @media (max-width: $screen-xs-max) { .login-page { .col-sm-5.pull-right { float: none !important; } } } .oauth-image-link { margin-right: 10px; img { width: 32px; height: 32px; } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/milestone.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/milestone.scs0000644000175600017570000000166212672631600031064 0ustar pravipravi.issues-sortable-list .str-truncated { max-width: 90%; } li.milestone { h4 { font-weight: bold; } .progress { height: 6px; } } .milestone-content { .issues-count { margin-right: 17px; float: right; width: 105px; } .issue-row { .color-label { border-radius: 2px; padding: 3px !important; } // Issue title span a { color: rgba(0,0,0,0.64); } } } .milestone-summary { margin-bottom: 25px; .milestone-stat { margin-right: 10px; } .remaining-days { color: $orange-light; } } .issues-sortable-list { .issue-detail { display: block; .issue-number{ color: rgba(0,0,0,0.44); margin-right: 5px; } .color-label { padding: 6px 10px; margin-right: 7px; margin-top: 10px; } .avatar { float: none; } } } .milestone-detail { border-bottom: 1px solid $border-color; padding: 20px 0; } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/notifications.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/notifications0000644000175600017570000000041412672631600031141 0ustar pravipravi.global-notifications-form .level-title { font-size: 15px; color: #333; font-weight: bold; } .notification-icon-holder { width: 20px; float: left; } .ns-part { color: $gl-primary; } .ns-watch { color: $gl-success; } .ns-mute { color: $gl-danger; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/graph.scss0000644000175600017570000000100112672631600030334 0ustar pravipravi.project-network { border: 1px solid $border-color; .controls { color: #888; font-size: 14px; padding: 5px; border-bottom: 1px solid $border-color; background: #EEE; } .network-graph { background: #FFF; height: 500px; overflow-y: scroll; overflow-x: hidden; } } .graphs { .graph-author-commits-count { } .graph-author-email { float: right; color: #777; } .graph-additions { color: #4a2; } .graph-deletions { color: #d12f19; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/admin.scss0000644000175600017570000000163612672631600030341 0ustar pravipravi/** * Admin area * */ .admin-dashboard { .data { a { h1 { line-height: 48px; font-size: 48px; padding: 20px; text-align: center; font-weight: normal; } } } .str-truncated { max-width: 60%; } } .admin-filter form { .select2-container { width: 100% } .controls { margin-left: 130px; } .form-actions { padding-left: 130px; background: #fff } .visibility-levels { .controls { margin-bottom: 9px; } i { color: inherit; } } } .broadcast-messages { .message { line-height: 2; } } .broadcast-message { @extend .alert-warning; padding: 10px; text-align: center; > div, p { display: inline; margin: 0; a { color: inherit; text-decoration: underline; } } } .broadcast-message-preview { @extend .broadcast-message; margin-bottom: 20px; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/dashboard.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/dashboard.scs0000644000175600017570000000122112672631600031003 0ustar pravipravi.dashboard { .side { .panel { .panel-heading { background: $background-color; border-top-left-radius: 0; } border-top-left-radius: 0; } } } .dashboard-search-filter { padding:5px; .search-text-input { float:left; @extend .col-md-2; } .btn { margin-left: 5px; float:left; } } .project-access-icon { margin-left: 10px; float: left; margin-right: 15px; margin-bottom: 15px; i { color: #888; } } .dash-project-avatar { float: left; .avatar { @include border-radius(50%); } } .dash-project-access-icon { float: left; margin-right: 5px; width: 16px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/import.scss0000644000175600017570000000056312672631600030561 0ustar pravipravii.icon-gitorious { display: inline-block; background-position: 0px 0px; background-size: contain; background-repeat: no-repeat; } i.icon-gitorious-small { background-image: image-url('gitorious-logo-blue.png'); width: 13px; height: 13px; } i.icon-gitorious-big { background-image: image-url('gitorious-logo-black.png'); width: 18px; height: 18px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/editor.scss0000644000175600017570000000152112672631600030530 0ustar pravipravi.file-editor { #editor{ border: none; @include border-radius(0); height: 500px; margin: 0; padding: 0; position: relative; width: 100%; } .ace_gutter-cell { background-color: $background-color; } .cancel-btn { color: #B94A48; &:hover { color: #B94A48; } } .file-title { @extend .monospace; line-height: 42px; padding-top: 7px; padding-bottom: 7px; } .editor-ref { background: $background-color; padding-right: $gl-padding; border-right: 1px solid $border-color; display: block; float: left; margin-right: 10px; } .editor-file-name { @extend .monospace; float: left; margin-right: 10px; } .new-file-name { display: inline-block; width: 450px; float: left; } .select2 { float: right; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/explore.scss0000644000175600017570000000014312672631600030717 0ustar pravipravi.explore-title { text-align: center; h3 { font-weight: normal; font-size: 30px; } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/ci_projects.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/ci_projects.s0000644000175600017570000000135212672631600031037 0ustar pravipravi.ci-body { .project-title { margin: 0; color: #444; font-size: 20px; line-height: 1.5; } .builds, .projects-table { .light { border-color: $border-color; } th, td { padding: 10px $gl-padding; } td { color: $gl-gray; vertical-align: middle !important; a { font-weight: normal; text-decoration: none; } } } .commit-info { .attr-name { margin-right: 5px; } pre.commit-message { background: none; padding: 0; margin: 0; border: none; margin: 20px 0; border-radius: 0; } } .loading{ font-size: 20px; } .ci-charts { fieldset { margin-bottom: 16px; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/emojis.scss0000644000175600017570000027076112672631600030546 0ustar pravipravi.emoji-0023-20E3 { background-position: 0px 0px; } .emoji-002A-20E3 { background-position: -20px 0px; } .emoji-0030-20E3 { background-position: 0px -20px; } .emoji-0031-20E3 { background-position: -20px -20px; } .emoji-0032-20E3 { background-position: -40px 0px; } .emoji-0033-20E3 { background-position: -40px -20px; } .emoji-0034-20E3 { background-position: 0px -40px; } .emoji-0035-20E3 { background-position: -20px -40px; } .emoji-0036-20E3 { background-position: -40px -40px; } .emoji-0037-20E3 { background-position: -60px 0px; } .emoji-0038-20E3 { background-position: -60px -20px; } .emoji-0039-20E3 { background-position: -60px -40px; } .emoji-00A9 { background-position: 0px -60px; } .emoji-00AE { background-position: -20px -60px; } .emoji-1F004 { background-position: -40px -60px; } .emoji-1F0CF { background-position: -60px -60px; } .emoji-1F170 { background-position: -80px 0px; } .emoji-1F171 { background-position: -80px -20px; } .emoji-1F17E { background-position: -80px -40px; } .emoji-1F17F { background-position: -80px -60px; } .emoji-1F18E { background-position: 0px -80px; } .emoji-1F191 { background-position: -20px -80px; } .emoji-1F192 { background-position: -40px -80px; } .emoji-1F193 { background-position: -60px -80px; } .emoji-1F194 { background-position: -80px -80px; } .emoji-1F195 { background-position: -100px 0px; } .emoji-1F196 { background-position: -100px -20px; } .emoji-1F197 { background-position: -100px -40px; } .emoji-1F198 { background-position: -100px -60px; } .emoji-1F199 { background-position: -100px -80px; } .emoji-1F19A { background-position: 0px -100px; } .emoji-1F1E6-1F1E8 { background-position: -20px -100px; } .emoji-1F1E6-1F1E9 { background-position: -40px -100px; } .emoji-1F1E6-1F1EA { background-position: -60px -100px; } .emoji-1F1E6-1F1EB { background-position: -80px -100px; } .emoji-1F1E6-1F1EC { background-position: -100px -100px; } .emoji-1F1E6-1F1EE { background-position: -120px 0px; } .emoji-1F1E6-1F1F1 { background-position: -120px -20px; } .emoji-1F1E6-1F1F2 { background-position: -120px -40px; } .emoji-1F1E6-1F1F4 { background-position: -120px -60px; } .emoji-1F1E6-1F1F6 { background-position: -120px -80px; } .emoji-1F1E6-1F1F7 { background-position: -120px -100px; } .emoji-1F1E6-1F1F8 { background-position: 0px -120px; } .emoji-1F1E6-1F1F9 { background-position: -20px -120px; } .emoji-1F1E6-1F1FA { background-position: -40px -120px; } .emoji-1F1E6-1F1FC { background-position: -60px -120px; } .emoji-1F1E6-1F1FD { background-position: -80px -120px; } .emoji-1F1E6-1F1FF { background-position: -100px -120px; } .emoji-1F1E7-1F1E6 { background-position: -120px -120px; } .emoji-1F1E7-1F1E7 { background-position: -140px 0px; } .emoji-1F1E7-1F1E9 { background-position: -140px -20px; } .emoji-1F1E7-1F1EA { background-position: -140px -40px; } .emoji-1F1E7-1F1EB { background-position: -140px -60px; } .emoji-1F1E7-1F1EC { background-position: -140px -80px; } .emoji-1F1E7-1F1ED { background-position: -140px -100px; } .emoji-1F1E7-1F1EE { background-position: -140px -120px; } .emoji-1F1E7-1F1EF { background-position: 0px -140px; } .emoji-1F1E7-1F1F1 { background-position: -20px -140px; } .emoji-1F1E7-1F1F2 { background-position: -40px -140px; } .emoji-1F1E7-1F1F3 { background-position: -60px -140px; } .emoji-1F1E7-1F1F4 { background-position: -80px -140px; } .emoji-1F1E7-1F1F6 { background-position: -100px -140px; } .emoji-1F1E7-1F1F7 { background-position: -120px -140px; } .emoji-1F1E7-1F1F8 { background-position: -140px -140px; } .emoji-1F1E7-1F1F9 { background-position: -160px 0px; } .emoji-1F1E7-1F1FB { background-position: -160px -20px; } .emoji-1F1E7-1F1FC { background-position: -160px -40px; } .emoji-1F1E7-1F1FE { background-position: -160px -60px; } .emoji-1F1E7-1F1FF { background-position: -160px -80px; } .emoji-1F1E8-1F1E6 { background-position: -160px -100px; } .emoji-1F1E8-1F1E8 { background-position: -160px -120px; } .emoji-1F1E8-1F1E9 { background-position: -160px -140px; } .emoji-1F1E8-1F1EB { background-position: 0px -160px; } .emoji-1F1E8-1F1EC { background-position: -20px -160px; } .emoji-1F1E8-1F1ED { background-position: -40px -160px; } .emoji-1F1E8-1F1EE { background-position: -60px -160px; } .emoji-1F1E8-1F1F0 { background-position: -80px -160px; } .emoji-1F1E8-1F1F1 { background-position: -100px -160px; } .emoji-1F1E8-1F1F2 { background-position: -120px -160px; } .emoji-1F1E8-1F1F3 { background-position: -140px -160px; } .emoji-1F1E8-1F1F4 { background-position: -160px -160px; } .emoji-1F1E8-1F1F5 { background-position: -180px 0px; } .emoji-1F1E8-1F1F7 { background-position: -180px -20px; } .emoji-1F1E8-1F1FA { background-position: -180px -40px; } .emoji-1F1E8-1F1FB { background-position: -180px -60px; } .emoji-1F1E8-1F1FC { background-position: -180px -80px; } .emoji-1F1E8-1F1FD { background-position: -180px -100px; } .emoji-1F1E8-1F1FE { background-position: -180px -120px; } .emoji-1F1E8-1F1FF { background-position: -180px -140px; } .emoji-1F1E9-1F1EA { background-position: -180px -160px; } .emoji-1F1E9-1F1EC { background-position: 0px -180px; } .emoji-1F1E9-1F1EF { background-position: -20px -180px; } .emoji-1F1E9-1F1F0 { background-position: -40px -180px; } .emoji-1F1E9-1F1F2 { background-position: -60px -180px; } .emoji-1F1E9-1F1F4 { background-position: -80px -180px; } .emoji-1F1E9-1F1FF { background-position: -100px -180px; } .emoji-1F1EA-1F1E6 { background-position: -120px -180px; } .emoji-1F1EA-1F1E8 { background-position: -140px -180px; } .emoji-1F1EA-1F1EA { background-position: -160px -180px; } .emoji-1F1EA-1F1EC { background-position: -180px -180px; } .emoji-1F1EA-1F1ED { background-position: -200px 0px; } .emoji-1F1EA-1F1F7 { background-position: -200px -20px; } .emoji-1F1EA-1F1F8 { background-position: -200px -40px; } .emoji-1F1EA-1F1F9 { background-position: -200px -60px; } .emoji-1F1EA-1F1FA { background-position: -200px -80px; } .emoji-1F1EB-1F1EE { background-position: -200px -100px; } .emoji-1F1EB-1F1EF { background-position: -200px -120px; } .emoji-1F1EB-1F1F0 { background-position: -200px -140px; } .emoji-1F1EB-1F1F2 { background-position: -200px -160px; } .emoji-1F1EB-1F1F4 { background-position: -200px -180px; } .emoji-1F1EB-1F1F7 { background-position: 0px -200px; } .emoji-1F1EC-1F1E6 { background-position: -20px -200px; } .emoji-1F1EC-1F1E7 { background-position: -40px -200px; } .emoji-1F1EC-1F1E9 { background-position: -60px -200px; } .emoji-1F1EC-1F1EA { background-position: -80px -200px; } .emoji-1F1EC-1F1EB { background-position: -100px -200px; } .emoji-1F1EC-1F1EC { background-position: -120px -200px; } .emoji-1F1EC-1F1ED { background-position: -140px -200px; } .emoji-1F1EC-1F1EE { background-position: -160px -200px; } .emoji-1F1EC-1F1F1 { background-position: -180px -200px; } .emoji-1F1EC-1F1F2 { background-position: -200px -200px; } .emoji-1F1EC-1F1F3 { background-position: -220px 0px; } .emoji-1F1EC-1F1F5 { background-position: -220px -20px; } .emoji-1F1EC-1F1F6 { background-position: -220px -40px; } .emoji-1F1EC-1F1F7 { background-position: -220px -60px; } .emoji-1F1EC-1F1F8 { background-position: -220px -80px; } .emoji-1F1EC-1F1F9 { background-position: -220px -100px; } .emoji-1F1EC-1F1FA { background-position: -220px -120px; } .emoji-1F1EC-1F1FC { background-position: -220px -140px; } .emoji-1F1EC-1F1FE { background-position: -220px -160px; } .emoji-1F1ED-1F1F0 { background-position: -220px -180px; } .emoji-1F1ED-1F1F2 { background-position: -220px -200px; } .emoji-1F1ED-1F1F3 { background-position: 0px -220px; } .emoji-1F1ED-1F1F7 { background-position: -20px -220px; } .emoji-1F1ED-1F1F9 { background-position: -40px -220px; } .emoji-1F1ED-1F1FA { background-position: -60px -220px; } .emoji-1F1EE-1F1E8 { background-position: -80px -220px; } .emoji-1F1EE-1F1E9 { background-position: -100px -220px; } .emoji-1F1EE-1F1EA { background-position: -120px -220px; } .emoji-1F1EE-1F1F1 { background-position: -140px -220px; } .emoji-1F1EE-1F1F2 { background-position: -160px -220px; } .emoji-1F1EE-1F1F3 { background-position: -180px -220px; } .emoji-1F1EE-1F1F4 { background-position: -200px -220px; } .emoji-1F1EE-1F1F6 { background-position: -220px -220px; } .emoji-1F1EE-1F1F7 { background-position: -240px 0px; } .emoji-1F1EE-1F1F8 { background-position: -240px -20px; } .emoji-1F1EE-1F1F9 { background-position: -240px -40px; } .emoji-1F1EF-1F1EA { background-position: -240px -60px; } .emoji-1F1EF-1F1F2 { background-position: -240px -80px; } .emoji-1F1EF-1F1F4 { background-position: -240px -100px; } .emoji-1F1EF-1F1F5 { background-position: -240px -120px; } .emoji-1F1F0-1F1EA { background-position: -240px -140px; } .emoji-1F1F0-1F1EC { background-position: -240px -160px; } .emoji-1F1F0-1F1ED { background-position: -240px -180px; } .emoji-1F1F0-1F1EE { background-position: -240px -200px; } .emoji-1F1F0-1F1F2 { background-position: -240px -220px; } .emoji-1F1F0-1F1F3 { background-position: 0px -240px; } .emoji-1F1F0-1F1F5 { background-position: -20px -240px; } .emoji-1F1F0-1F1F7 { background-position: -40px -240px; } .emoji-1F1F0-1F1FC { background-position: -60px -240px; } .emoji-1F1F0-1F1FE { background-position: -80px -240px; } .emoji-1F1F0-1F1FF { background-position: -100px -240px; } .emoji-1F1F1-1F1E6 { background-position: -120px -240px; } .emoji-1F1F1-1F1E7 { background-position: -140px -240px; } .emoji-1F1F1-1F1E8 { background-position: -160px -240px; } .emoji-1F1F1-1F1EE { background-position: -180px -240px; } .emoji-1F1F1-1F1F0 { background-position: -200px -240px; } .emoji-1F1F1-1F1F7 { background-position: -220px -240px; } .emoji-1F1F1-1F1F8 { background-position: -240px -240px; } .emoji-1F1F1-1F1F9 { background-position: -260px 0px; } .emoji-1F1F1-1F1FA { background-position: -260px -20px; } .emoji-1F1F1-1F1FB { background-position: -260px -40px; } .emoji-1F1F1-1F1FE { background-position: -260px -60px; } .emoji-1F1F2-1F1E6 { background-position: -260px -80px; } .emoji-1F1F2-1F1E8 { background-position: -260px -100px; } .emoji-1F1F2-1F1E9 { background-position: -260px -120px; } .emoji-1F1F2-1F1EA { background-position: -260px -140px; } .emoji-1F1F2-1F1EB { background-position: -260px -160px; } .emoji-1F1F2-1F1EC { background-position: -260px -180px; } .emoji-1F1F2-1F1ED { background-position: -260px -200px; } .emoji-1F1F2-1F1F0 { background-position: -260px -220px; } .emoji-1F1F2-1F1F1 { background-position: -260px -240px; } .emoji-1F1F2-1F1F2 { background-position: 0px -260px; } .emoji-1F1F2-1F1F3 { background-position: -20px -260px; } .emoji-1F1F2-1F1F4 { background-position: -40px -260px; } .emoji-1F1F2-1F1F5 { background-position: -60px -260px; } .emoji-1F1F2-1F1F6 { background-position: -80px -260px; } .emoji-1F1F2-1F1F7 { background-position: -100px -260px; } .emoji-1F1F2-1F1F8 { background-position: -120px -260px; } .emoji-1F1F2-1F1F9 { background-position: -140px -260px; } .emoji-1F1F2-1F1FA { background-position: -160px -260px; } .emoji-1F1F2-1F1FB { background-position: -180px -260px; } .emoji-1F1F2-1F1FC { background-position: -200px -260px; } .emoji-1F1F2-1F1FD { background-position: -220px -260px; } .emoji-1F1F2-1F1FE { background-position: -240px -260px; } .emoji-1F1F2-1F1FF { background-position: -260px -260px; } .emoji-1F1F3-1F1E6 { background-position: -280px 0px; } .emoji-1F1F3-1F1E8 { background-position: -280px -20px; } .emoji-1F1F3-1F1EA { background-position: -280px -40px; } .emoji-1F1F3-1F1EB { background-position: -280px -60px; } .emoji-1F1F3-1F1EC { background-position: -280px -80px; } .emoji-1F1F3-1F1EE { background-position: -280px -100px; } .emoji-1F1F3-1F1F1 { background-position: -280px -120px; } .emoji-1F1F3-1F1F4 { background-position: -280px -140px; } .emoji-1F1F3-1F1F5 { background-position: -280px -160px; } .emoji-1F1F3-1F1F7 { background-position: -280px -180px; } .emoji-1F1F3-1F1FA { background-position: -280px -200px; } .emoji-1F1F3-1F1FF { background-position: -280px -220px; } .emoji-1F1F4-1F1F2 { background-position: -280px -240px; } .emoji-1F1F5-1F1E6 { background-position: -280px -260px; } .emoji-1F1F5-1F1EA { background-position: 0px -280px; } .emoji-1F1F5-1F1EB { background-position: -20px -280px; } .emoji-1F1F5-1F1EC { background-position: -40px -280px; } .emoji-1F1F5-1F1ED { background-position: -60px -280px; } .emoji-1F1F5-1F1F0 { background-position: -80px -280px; } .emoji-1F1F5-1F1F1 { background-position: -100px -280px; } .emoji-1F1F5-1F1F2 { background-position: -120px -280px; } .emoji-1F1F5-1F1F3 { background-position: -140px -280px; } .emoji-1F1F5-1F1F7 { background-position: -160px -280px; } .emoji-1F1F5-1F1F8 { background-position: -180px -280px; } .emoji-1F1F5-1F1F9 { background-position: -200px -280px; } .emoji-1F1F5-1F1FC { background-position: -220px -280px; } .emoji-1F1F5-1F1FE { background-position: -240px -280px; } .emoji-1F1F6-1F1E6 { background-position: -260px -280px; } .emoji-1F1F7-1F1EA { background-position: -280px -280px; } .emoji-1F1F7-1F1F4 { background-position: -300px 0px; } .emoji-1F1F7-1F1F8 { background-position: -300px -20px; } .emoji-1F1F7-1F1FA { background-position: -300px -40px; } .emoji-1F1F7-1F1FC { background-position: -300px -60px; } .emoji-1F1F8-1F1E6 { background-position: -300px -80px; } .emoji-1F1F8-1F1E7 { background-position: -300px -100px; } .emoji-1F1F8-1F1E8 { background-position: -300px -120px; } .emoji-1F1F8-1F1E9 { background-position: -300px -140px; } .emoji-1F1F8-1F1EA { background-position: -300px -160px; } .emoji-1F1F8-1F1EC { background-position: -300px -180px; } .emoji-1F1F8-1F1ED { background-position: -300px -200px; } .emoji-1F1F8-1F1EE { background-position: -300px -220px; } .emoji-1F1F8-1F1EF { background-position: -300px -240px; } .emoji-1F1F8-1F1F0 { background-position: -300px -260px; } .emoji-1F1F8-1F1F1 { background-position: -300px -280px; } .emoji-1F1F8-1F1F2 { background-position: 0px -300px; } .emoji-1F1F8-1F1F3 { background-position: -20px -300px; } .emoji-1F1F8-1F1F4 { background-position: -40px -300px; } .emoji-1F1F8-1F1F7 { background-position: -60px -300px; } .emoji-1F1F8-1F1F8 { background-position: -80px -300px; } .emoji-1F1F8-1F1F9 { background-position: -100px -300px; } .emoji-1F1F8-1F1FB { background-position: -120px -300px; } .emoji-1F1F8-1F1FD { background-position: -140px -300px; } .emoji-1F1F8-1F1FE { background-position: -160px -300px; } .emoji-1F1F8-1F1FF { background-position: -180px -300px; } .emoji-1F1F9-1F1E6 { background-position: -200px -300px; } .emoji-1F1F9-1F1E8 { background-position: -220px -300px; } .emoji-1F1F9-1F1E9 { background-position: -240px -300px; } .emoji-1F1F9-1F1EB { background-position: -260px -300px; } .emoji-1F1F9-1F1EC { background-position: -280px -300px; } .emoji-1F1F9-1F1ED { background-position: -300px -300px; } .emoji-1F1F9-1F1EF { background-position: -320px 0px; } .emoji-1F1F9-1F1F0 { background-position: -320px -20px; } .emoji-1F1F9-1F1F1 { background-position: -320px -40px; } .emoji-1F1F9-1F1F2 { background-position: -320px -60px; } .emoji-1F1F9-1F1F3 { background-position: -320px -80px; } .emoji-1F1F9-1F1F4 { background-position: -320px -100px; } .emoji-1F1F9-1F1F7 { background-position: -320px -120px; } .emoji-1F1F9-1F1F9 { background-position: -320px -140px; } .emoji-1F1F9-1F1FB { background-position: -320px -160px; } .emoji-1F1F9-1F1FC { background-position: -320px -180px; } .emoji-1F1F9-1F1FF { background-position: -320px -200px; } .emoji-1F1FA-1F1E6 { background-position: -320px -220px; } .emoji-1F1FA-1F1EC { background-position: -320px -240px; } .emoji-1F1FA-1F1F2 { background-position: -320px -260px; } .emoji-1F1FA-1F1F8 { background-position: -320px -280px; } .emoji-1F1FA-1F1FE { background-position: -320px -300px; } .emoji-1F1FA-1F1FF { background-position: 0px -320px; } .emoji-1F1FB-1F1E6 { background-position: -20px -320px; } .emoji-1F1FB-1F1E8 { background-position: -40px -320px; } .emoji-1F1FB-1F1EA { background-position: -60px -320px; } .emoji-1F1FB-1F1EC { background-position: -80px -320px; } .emoji-1F1FB-1F1EE { background-position: -100px -320px; } .emoji-1F1FB-1F1F3 { background-position: -120px -320px; } .emoji-1F1FB-1F1FA { background-position: -140px -320px; } .emoji-1F1FC-1F1EB { background-position: -160px -320px; } .emoji-1F1FC-1F1F8 { background-position: -180px -320px; } .emoji-1F1FD-1F1F0 { background-position: -200px -320px; } .emoji-1F1FE-1F1EA { background-position: -220px -320px; } .emoji-1F1FE-1F1F9 { background-position: -240px -320px; } .emoji-1F1FF-1F1E6 { background-position: -260px -320px; } .emoji-1F1FF-1F1F2 { background-position: -280px -320px; } .emoji-1F1FF-1F1FC { background-position: -300px -320px; } .emoji-1F201 { background-position: -320px -320px; } .emoji-1F202 { background-position: -340px 0px; } .emoji-1F21A { background-position: -340px -20px; } .emoji-1F22F { background-position: -340px -40px; } .emoji-1F232 { background-position: -340px -60px; } .emoji-1F233 { background-position: -340px -80px; } .emoji-1F234 { background-position: -340px -100px; } .emoji-1F235 { background-position: -340px -120px; } .emoji-1F236 { background-position: -340px -140px; } .emoji-1F237 { background-position: -340px -160px; } .emoji-1F238 { background-position: -340px -180px; } .emoji-1F239 { background-position: -340px -200px; } .emoji-1F23A { background-position: -340px -220px; } .emoji-1F250 { background-position: -340px -240px; } .emoji-1F251 { background-position: -340px -260px; } .emoji-1F300 { background-position: -340px -280px; } .emoji-1F301 { background-position: -340px -300px; } .emoji-1F302 { background-position: -340px -320px; } .emoji-1F303 { background-position: 0px -340px; } .emoji-1F304 { background-position: -20px -340px; } .emoji-1F305 { background-position: -40px -340px; } .emoji-1F306 { background-position: -60px -340px; } .emoji-1F307 { background-position: -80px -340px; } .emoji-1F308 { background-position: -100px -340px; } .emoji-1F309 { background-position: -120px -340px; } .emoji-1F30A { background-position: -140px -340px; } .emoji-1F30B { background-position: -160px -340px; } .emoji-1F30C { background-position: -180px -340px; } .emoji-1F30D { background-position: -200px -340px; } .emoji-1F30E { background-position: -220px -340px; } .emoji-1F30F { background-position: -240px -340px; } .emoji-1F310 { background-position: -260px -340px; } .emoji-1F311 { background-position: -280px -340px; } .emoji-1F312 { background-position: -300px -340px; } .emoji-1F313 { background-position: -320px -340px; } .emoji-1F314 { background-position: -340px -340px; } .emoji-1F315 { background-position: -360px 0px; } .emoji-1F316 { background-position: -360px -20px; } .emoji-1F317 { background-position: -360px -40px; } .emoji-1F318 { background-position: -360px -60px; } .emoji-1F319 { background-position: -360px -80px; } .emoji-1F31A { background-position: -360px -100px; } .emoji-1F31B { background-position: -360px -120px; } .emoji-1F31C { background-position: -360px -140px; } .emoji-1F31D { background-position: -360px -160px; } .emoji-1F31E { background-position: -360px -180px; } .emoji-1F31F { background-position: -360px -200px; } .emoji-1F320 { background-position: -360px -220px; } .emoji-1F321 { background-position: -360px -240px; } .emoji-1F324 { background-position: -360px -260px; } .emoji-1F325 { background-position: -360px -280px; } .emoji-1F326 { background-position: -360px -300px; } .emoji-1F327 { background-position: -360px -320px; } .emoji-1F328 { background-position: -360px -340px; } .emoji-1F329 { background-position: 0px -360px; } .emoji-1F32A { background-position: -20px -360px; } .emoji-1F32B { background-position: -40px -360px; } .emoji-1F32C { background-position: -60px -360px; } .emoji-1F32D { background-position: -80px -360px; } .emoji-1F32E { background-position: -100px -360px; } .emoji-1F32F { background-position: -120px -360px; } .emoji-1F330 { background-position: -140px -360px; } .emoji-1F331 { background-position: -160px -360px; } .emoji-1F332 { background-position: -180px -360px; } .emoji-1F333 { background-position: -200px -360px; } .emoji-1F334 { background-position: -220px -360px; } .emoji-1F335 { background-position: -240px -360px; } .emoji-1F336 { background-position: -260px -360px; } .emoji-1F337 { background-position: -280px -360px; } .emoji-1F338 { background-position: -300px -360px; } .emoji-1F339 { background-position: -320px -360px; } .emoji-1F33A { background-position: -340px -360px; } .emoji-1F33B { background-position: -360px -360px; } .emoji-1F33C { background-position: -380px 0px; } .emoji-1F33D { background-position: -380px -20px; } .emoji-1F33E { background-position: -380px -40px; } .emoji-1F33F { background-position: -380px -60px; } .emoji-1F340 { background-position: -380px -80px; } .emoji-1F341 { background-position: -380px -100px; } .emoji-1F342 { background-position: -380px -120px; } .emoji-1F343 { background-position: -380px -140px; } .emoji-1F344 { background-position: -380px -160px; } .emoji-1F345 { background-position: -380px -180px; } .emoji-1F346 { background-position: -380px -200px; } .emoji-1F347 { background-position: -380px -220px; } .emoji-1F348 { background-position: -380px -240px; } .emoji-1F349 { background-position: -380px -260px; } .emoji-1F34A { background-position: -380px -280px; } .emoji-1F34B { background-position: -380px -300px; } .emoji-1F34C { background-position: -380px -320px; } .emoji-1F34D { background-position: -380px -340px; } .emoji-1F34E { background-position: -380px -360px; } .emoji-1F34F { background-position: 0px -380px; } .emoji-1F350 { background-position: -20px -380px; } .emoji-1F351 { background-position: -40px -380px; } .emoji-1F352 { background-position: -60px -380px; } .emoji-1F353 { background-position: -80px -380px; } .emoji-1F354 { background-position: -100px -380px; } .emoji-1F355 { background-position: -120px -380px; } .emoji-1F356 { background-position: -140px -380px; } .emoji-1F357 { background-position: -160px -380px; } .emoji-1F358 { background-position: -180px -380px; } .emoji-1F359 { background-position: -200px -380px; } .emoji-1F35A { background-position: -220px -380px; } .emoji-1F35B { background-position: -240px -380px; } .emoji-1F35C { background-position: -260px -380px; } .emoji-1F35D { background-position: -280px -380px; } .emoji-1F35E { background-position: -300px -380px; } .emoji-1F35F { background-position: -320px -380px; } .emoji-1F360 { background-position: -340px -380px; } .emoji-1F361 { background-position: -360px -380px; } .emoji-1F362 { background-position: -380px -380px; } .emoji-1F363 { background-position: -400px 0px; } .emoji-1F364 { background-position: -400px -20px; } .emoji-1F365 { background-position: -400px -40px; } .emoji-1F366 { background-position: -400px -60px; } .emoji-1F367 { background-position: -400px -80px; } .emoji-1F368 { background-position: -400px -100px; } .emoji-1F369 { background-position: -400px -120px; } .emoji-1F36A { background-position: -400px -140px; } .emoji-1F36B { background-position: -400px -160px; } .emoji-1F36C { background-position: -400px -180px; } .emoji-1F36D { background-position: -400px -200px; } .emoji-1F36E { background-position: -400px -220px; } .emoji-1F36F { background-position: -400px -240px; } .emoji-1F370 { background-position: -400px -260px; } .emoji-1F371 { background-position: -400px -280px; } .emoji-1F372 { background-position: -400px -300px; } .emoji-1F373 { background-position: -400px -320px; } .emoji-1F374 { background-position: -400px -340px; } .emoji-1F375 { background-position: -400px -360px; } .emoji-1F376 { background-position: -400px -380px; } .emoji-1F377 { background-position: 0px -400px; } .emoji-1F378 { background-position: -20px -400px; } .emoji-1F379 { background-position: -40px -400px; } .emoji-1F37A { background-position: -60px -400px; } .emoji-1F37B { background-position: -80px -400px; } .emoji-1F37C { background-position: -100px -400px; } .emoji-1F37D { background-position: -120px -400px; } .emoji-1F37E { background-position: -140px -400px; } .emoji-1F37F { background-position: -160px -400px; } .emoji-1F380 { background-position: -180px -400px; } .emoji-1F381 { background-position: -200px -400px; } .emoji-1F382 { background-position: -220px -400px; } .emoji-1F383 { background-position: -240px -400px; } .emoji-1F384 { background-position: -260px -400px; } .emoji-1F385 { background-position: -280px -400px; } .emoji-1F385-1F3FB { background-position: -300px -400px; } .emoji-1F385-1F3FC { background-position: -320px -400px; } .emoji-1F385-1F3FD { background-position: -340px -400px; } .emoji-1F385-1F3FE { background-position: -360px -400px; } .emoji-1F385-1F3FF { background-position: -380px -400px; } .emoji-1F386 { background-position: -400px -400px; } .emoji-1F387 { background-position: -420px 0px; } .emoji-1F388 { background-position: -420px -20px; } .emoji-1F389 { background-position: -420px -40px; } .emoji-1F38A { background-position: -420px -60px; } .emoji-1F38B { background-position: -420px -80px; } .emoji-1F38C { background-position: -420px -100px; } .emoji-1F38D { background-position: -420px -120px; } .emoji-1F38E { background-position: -420px -140px; } .emoji-1F38F { background-position: -420px -160px; } .emoji-1F390 { background-position: -420px -180px; } .emoji-1F391 { background-position: -420px -200px; } .emoji-1F392 { background-position: -420px -220px; } .emoji-1F393 { background-position: -420px -240px; } .emoji-1F394 { background-position: -420px -260px; } .emoji-1F395 { background-position: -420px -280px; } .emoji-1F396 { background-position: -420px -300px; } .emoji-1F397 { background-position: -420px -320px; } .emoji-1F398 { background-position: -420px -340px; } .emoji-1F399 { background-position: -420px -360px; } .emoji-1F39A { background-position: -420px -380px; } .emoji-1F39B { background-position: -420px -400px; } .emoji-1F39C { background-position: 0px -420px; } .emoji-1F39D { background-position: -20px -420px; } .emoji-1F39E { background-position: -40px -420px; } .emoji-1F39F { background-position: -60px -420px; } .emoji-1F3A0 { background-position: -80px -420px; } .emoji-1F3A1 { background-position: -100px -420px; } .emoji-1F3A2 { background-position: -120px -420px; } .emoji-1F3A3 { background-position: -140px -420px; } .emoji-1F3A4 { background-position: -160px -420px; } .emoji-1F3A5 { background-position: -180px -420px; } .emoji-1F3A6 { background-position: -200px -420px; } .emoji-1F3A7 { background-position: -220px -420px; } .emoji-1F3A8 { background-position: -240px -420px; } .emoji-1F3A9 { background-position: -260px -420px; } .emoji-1F3AA { background-position: -280px -420px; } .emoji-1F3AB { background-position: -300px -420px; } .emoji-1F3AC { background-position: -320px -420px; } .emoji-1F3AD { background-position: -340px -420px; } .emoji-1F3AE { background-position: -360px -420px; } .emoji-1F3AF { background-position: -380px -420px; } .emoji-1F3B0 { background-position: -400px -420px; } .emoji-1F3B1 { background-position: -420px -420px; } .emoji-1F3B2 { background-position: -440px 0px; } .emoji-1F3B3 { background-position: -440px -20px; } .emoji-1F3B4 { background-position: -440px -40px; } .emoji-1F3B5 { background-position: -440px -60px; } .emoji-1F3B6 { background-position: -440px -80px; } .emoji-1F3B7 { background-position: -440px -100px; } .emoji-1F3B8 { background-position: -440px -120px; } .emoji-1F3B9 { background-position: -440px -140px; } .emoji-1F3BA { background-position: -440px -160px; } .emoji-1F3BB { background-position: -440px -180px; } .emoji-1F3BC { background-position: -440px -200px; } .emoji-1F3BD { background-position: -440px -220px; } .emoji-1F3BE { background-position: -440px -240px; } .emoji-1F3BF { background-position: -440px -260px; } .emoji-1F3C0 { background-position: -440px -280px; } .emoji-1F3C1 { background-position: -440px -300px; } .emoji-1F3C2 { background-position: -440px -320px; } .emoji-1F3C3 { background-position: -440px -340px; } .emoji-1F3C3-1F3FB { background-position: -440px -360px; } .emoji-1F3C3-1F3FC { background-position: -440px -380px; } .emoji-1F3C3-1F3FD { background-position: -440px -400px; } .emoji-1F3C3-1F3FE { background-position: -440px -420px; } .emoji-1F3C3-1F3FF { background-position: 0px -440px; } .emoji-1F3C4 { background-position: -20px -440px; } .emoji-1F3C4-1F3FB { background-position: -40px -440px; } .emoji-1F3C4-1F3FC { background-position: -60px -440px; } .emoji-1F3C4-1F3FD { background-position: -80px -440px; } .emoji-1F3C4-1F3FE { background-position: -100px -440px; } .emoji-1F3C4-1F3FF { background-position: -120px -440px; } .emoji-1F3C5 { background-position: -140px -440px; } .emoji-1F3C6 { background-position: -160px -440px; } .emoji-1F3C7 { background-position: -180px -440px; } .emoji-1F3C7-1F3FB { background-position: -200px -440px; } .emoji-1F3C7-1F3FC { background-position: -220px -440px; } .emoji-1F3C7-1F3FD { background-position: -240px -440px; } .emoji-1F3C7-1F3FE { background-position: -260px -440px; } .emoji-1F3C7-1F3FF { background-position: -280px -440px; } .emoji-1F3C8 { background-position: -300px -440px; } .emoji-1F3C9 { background-position: -320px -440px; } .emoji-1F3CA { background-position: -340px -440px; } .emoji-1F3CA-1F3FB { background-position: -360px -440px; } .emoji-1F3CA-1F3FC { background-position: -380px -440px; } .emoji-1F3CA-1F3FD { background-position: -400px -440px; } .emoji-1F3CA-1F3FE { background-position: -420px -440px; } .emoji-1F3CA-1F3FF { background-position: -440px -440px; } .emoji-1F3CB { background-position: -460px 0px; } .emoji-1F3CB-1F3FB { background-position: -460px -20px; } .emoji-1F3CB-1F3FC { background-position: -460px -40px; } .emoji-1F3CB-1F3FD { background-position: -460px -60px; } .emoji-1F3CB-1F3FE { background-position: -460px -80px; } .emoji-1F3CB-1F3FF { background-position: -460px -100px; } .emoji-1F3CC { background-position: -460px -120px; } .emoji-1F3CD { background-position: -460px -140px; } .emoji-1F3CE { background-position: -460px -160px; } .emoji-1F3CF { background-position: -460px -180px; } .emoji-1F3D0 { background-position: -460px -200px; } .emoji-1F3D1 { background-position: -460px -220px; } .emoji-1F3D2 { background-position: -460px -240px; } .emoji-1F3D3 { background-position: -460px -260px; } .emoji-1F3D4 { background-position: -460px -280px; } .emoji-1F3D5 { background-position: -460px -300px; } .emoji-1F3D6 { background-position: -460px -320px; } .emoji-1F3D7 { background-position: -460px -340px; } .emoji-1F3D8 { background-position: -460px -360px; } .emoji-1F3D9 { background-position: -460px -380px; } .emoji-1F3DA { background-position: -460px -400px; } .emoji-1F3DB { background-position: -460px -420px; } .emoji-1F3DC { background-position: -460px -440px; } .emoji-1F3DD { background-position: 0px -460px; } .emoji-1F3DE { background-position: -20px -460px; } .emoji-1F3DF { background-position: -40px -460px; } .emoji-1F3E0 { background-position: -60px -460px; } .emoji-1F3E1 { background-position: -80px -460px; } .emoji-1F3E2 { background-position: -100px -460px; } .emoji-1F3E3 { background-position: -120px -460px; } .emoji-1F3E4 { background-position: -140px -460px; } .emoji-1F3E5 { background-position: -160px -460px; } .emoji-1F3E6 { background-position: -180px -460px; } .emoji-1F3E7 { background-position: -200px -460px; } .emoji-1F3E8 { background-position: -220px -460px; } .emoji-1F3E9 { background-position: -240px -460px; } .emoji-1F3EA { background-position: -260px -460px; } .emoji-1F3EB { background-position: -280px -460px; } .emoji-1F3EC { background-position: -300px -460px; } .emoji-1F3ED { background-position: -320px -460px; } .emoji-1F3EE { background-position: -340px -460px; } .emoji-1F3EF { background-position: -360px -460px; } .emoji-1F3F0 { background-position: -380px -460px; } .emoji-1F3F1 { background-position: -400px -460px; } .emoji-1F3F2 { background-position: -420px -460px; } .emoji-1F3F3 { background-position: -440px -460px; } .emoji-1F3F4 { background-position: -460px -460px; } .emoji-1F3F5 { background-position: -480px 0px; } .emoji-1F3F6 { background-position: -480px -20px; } .emoji-1F3F7 { background-position: -480px -40px; } .emoji-1F3F8 { background-position: -480px -60px; } .emoji-1F3F9 { background-position: -480px -80px; } .emoji-1F3FA { background-position: -480px -100px; } .emoji-1F3FB { background-position: -480px -120px; } .emoji-1F3FC { background-position: -480px -140px; } .emoji-1F3FD { background-position: -480px -160px; } .emoji-1F3FE { background-position: -480px -180px; } .emoji-1F3FF { background-position: -480px -200px; } .emoji-1F400 { background-position: -480px -220px; } .emoji-1F401 { background-position: -480px -240px; } .emoji-1F402 { background-position: -480px -260px; } .emoji-1F403 { background-position: -480px -280px; } .emoji-1F404 { background-position: -480px -300px; } .emoji-1F405 { background-position: -480px -320px; } .emoji-1F406 { background-position: -480px -340px; } .emoji-1F407 { background-position: -480px -360px; } .emoji-1F408 { background-position: -480px -380px; } .emoji-1F409 { background-position: -480px -400px; } .emoji-1F40A { background-position: -480px -420px; } .emoji-1F40B { background-position: -480px -440px; } .emoji-1F40C { background-position: -480px -460px; } .emoji-1F40D { background-position: 0px -480px; } .emoji-1F40E { background-position: -20px -480px; } .emoji-1F40F { background-position: -40px -480px; } .emoji-1F410 { background-position: -60px -480px; } .emoji-1F411 { background-position: -80px -480px; } .emoji-1F412 { background-position: -100px -480px; } .emoji-1F413 { background-position: -120px -480px; } .emoji-1F414 { background-position: -140px -480px; } .emoji-1F415 { background-position: -160px -480px; } .emoji-1F416 { background-position: -180px -480px; } .emoji-1F417 { background-position: -200px -480px; } .emoji-1F418 { background-position: -220px -480px; } .emoji-1F419 { background-position: -240px -480px; } .emoji-1F41A { background-position: -260px -480px; } .emoji-1F41B { background-position: -280px -480px; } .emoji-1F41C { background-position: -300px -480px; } .emoji-1F41D { background-position: -320px -480px; } .emoji-1F41E { background-position: -340px -480px; } .emoji-1F41F { background-position: -360px -480px; } .emoji-1F420 { background-position: -380px -480px; } .emoji-1F421 { background-position: -400px -480px; } .emoji-1F422 { background-position: -420px -480px; } .emoji-1F423 { background-position: -440px -480px; } .emoji-1F424 { background-position: -460px -480px; } .emoji-1F425 { background-position: -480px -480px; } .emoji-1F426 { background-position: -500px 0px; } .emoji-1F427 { background-position: -500px -20px; } .emoji-1F428 { background-position: -500px -40px; } .emoji-1F429 { background-position: -500px -60px; } .emoji-1F42A { background-position: -500px -80px; } .emoji-1F42B { background-position: -500px -100px; } .emoji-1F42C { background-position: -500px -120px; } .emoji-1F42D { background-position: -500px -140px; } .emoji-1F42E { background-position: -500px -160px; } .emoji-1F42F { background-position: -500px -180px; } .emoji-1F430 { background-position: -500px -200px; } .emoji-1F431 { background-position: -500px -220px; } .emoji-1F432 { background-position: -500px -240px; } .emoji-1F433 { background-position: -500px -260px; } .emoji-1F434 { background-position: -500px -280px; } .emoji-1F435 { background-position: -500px -300px; } .emoji-1F436 { background-position: -500px -320px; } .emoji-1F437 { background-position: -500px -340px; } .emoji-1F438 { background-position: -500px -360px; } .emoji-1F439 { background-position: -500px -380px; } .emoji-1F43A { background-position: -500px -400px; } .emoji-1F43B { background-position: -500px -420px; } .emoji-1F43C { background-position: -500px -440px; } .emoji-1F43D { background-position: -500px -460px; } .emoji-1F43E { background-position: -500px -480px; } .emoji-1F43F { background-position: 0px -500px; } .emoji-1F440 { background-position: -20px -500px; } .emoji-1F441 { background-position: -40px -500px; } .emoji-1F441-1F5E8 { background-position: -60px -500px; } .emoji-1F442 { background-position: -80px -500px; } .emoji-1F442-1F3FB { background-position: -100px -500px; } .emoji-1F442-1F3FC { background-position: -120px -500px; } .emoji-1F442-1F3FD { background-position: -140px -500px; } .emoji-1F442-1F3FE { background-position: -160px -500px; } .emoji-1F442-1F3FF { background-position: -180px -500px; } .emoji-1F443 { background-position: -200px -500px; } .emoji-1F443-1F3FB { background-position: -220px -500px; } .emoji-1F443-1F3FC { background-position: -240px -500px; } .emoji-1F443-1F3FD { background-position: -260px -500px; } .emoji-1F443-1F3FE { background-position: -280px -500px; } .emoji-1F443-1F3FF { background-position: -300px -500px; } .emoji-1F444 { background-position: -320px -500px; } .emoji-1F445 { background-position: -340px -500px; } .emoji-1F446 { background-position: -360px -500px; } .emoji-1F446-1F3FB { background-position: -380px -500px; } .emoji-1F446-1F3FC { background-position: -400px -500px; } .emoji-1F446-1F3FD { background-position: -420px -500px; } .emoji-1F446-1F3FE { background-position: -440px -500px; } .emoji-1F446-1F3FF { background-position: -460px -500px; } .emoji-1F447 { background-position: -480px -500px; } .emoji-1F447-1F3FB { background-position: -500px -500px; } .emoji-1F447-1F3FC { background-position: -520px 0px; } .emoji-1F447-1F3FD { background-position: -520px -20px; } .emoji-1F447-1F3FE { background-position: -520px -40px; } .emoji-1F447-1F3FF { background-position: -520px -60px; } .emoji-1F448 { background-position: -520px -80px; } .emoji-1F448-1F3FB { background-position: -520px -100px; } .emoji-1F448-1F3FC { background-position: -520px -120px; } .emoji-1F448-1F3FD { background-position: -520px -140px; } .emoji-1F448-1F3FE { background-position: -520px -160px; } .emoji-1F448-1F3FF { background-position: -520px -180px; } .emoji-1F449 { background-position: -520px -200px; } .emoji-1F449-1F3FB { background-position: -520px -220px; } .emoji-1F449-1F3FC { background-position: -520px -240px; } .emoji-1F449-1F3FD { background-position: -520px -260px; } .emoji-1F449-1F3FE { background-position: -520px -280px; } .emoji-1F449-1F3FF { background-position: -520px -300px; } .emoji-1F44A { background-position: -520px -320px; } .emoji-1F44A-1F3FB { background-position: -520px -340px; } .emoji-1F44A-1F3FC { background-position: -520px -360px; } .emoji-1F44A-1F3FD { background-position: -520px -380px; } .emoji-1F44A-1F3FE { background-position: -520px -400px; } .emoji-1F44A-1F3FF { background-position: -520px -420px; } .emoji-1F44B { background-position: -520px -440px; } .emoji-1F44B-1F3FB { background-position: -520px -460px; } .emoji-1F44B-1F3FC { background-position: -520px -480px; } .emoji-1F44B-1F3FD { background-position: -520px -500px; } .emoji-1F44B-1F3FE { background-position: 0px -520px; } .emoji-1F44B-1F3FF { background-position: -20px -520px; } .emoji-1F44C { background-position: -40px -520px; } .emoji-1F44C-1F3FB { background-position: -60px -520px; } .emoji-1F44C-1F3FC { background-position: -80px -520px; } .emoji-1F44C-1F3FD { background-position: -100px -520px; } .emoji-1F44C-1F3FE { background-position: -120px -520px; } .emoji-1F44C-1F3FF { background-position: -140px -520px; } .emoji-1F44D { background-position: -160px -520px; } .emoji-1F44D-1F3FB { background-position: -180px -520px; } .emoji-1F44D-1F3FC { background-position: -200px -520px; } .emoji-1F44D-1F3FD { background-position: -220px -520px; } .emoji-1F44D-1F3FE { background-position: -240px -520px; } .emoji-1F44D-1F3FF { background-position: -260px -520px; } .emoji-1F44E { background-position: -280px -520px; } .emoji-1F44E-1F3FB { background-position: -300px -520px; } .emoji-1F44E-1F3FC { background-position: -320px -520px; } .emoji-1F44E-1F3FD { background-position: -340px -520px; } .emoji-1F44E-1F3FE { background-position: -360px -520px; } .emoji-1F44E-1F3FF { background-position: -380px -520px; } .emoji-1F44F { background-position: -400px -520px; } .emoji-1F44F-1F3FB { background-position: -420px -520px; } .emoji-1F44F-1F3FC { background-position: -440px -520px; } .emoji-1F44F-1F3FD { background-position: -460px -520px; } .emoji-1F44F-1F3FE { background-position: -480px -520px; } .emoji-1F44F-1F3FF { background-position: -500px -520px; } .emoji-1F450 { background-position: -520px -520px; } .emoji-1F450-1F3FB { background-position: -540px 0px; } .emoji-1F450-1F3FC { background-position: -540px -20px; } .emoji-1F450-1F3FD { background-position: -540px -40px; } .emoji-1F450-1F3FE { background-position: -540px -60px; } .emoji-1F450-1F3FF { background-position: -540px -80px; } .emoji-1F451 { background-position: -540px -100px; } .emoji-1F452 { background-position: -540px -120px; } .emoji-1F453 { background-position: -540px -140px; } .emoji-1F454 { background-position: -540px -160px; } .emoji-1F455 { background-position: -540px -180px; } .emoji-1F456 { background-position: -540px -200px; } .emoji-1F457 { background-position: -540px -220px; } .emoji-1F458 { background-position: -540px -240px; } .emoji-1F459 { background-position: -540px -260px; } .emoji-1F45A { background-position: -540px -280px; } .emoji-1F45B { background-position: -540px -300px; } .emoji-1F45C { background-position: -540px -320px; } .emoji-1F45D { background-position: -540px -340px; } .emoji-1F45E { background-position: -540px -360px; } .emoji-1F45F { background-position: -540px -380px; } .emoji-1F460 { background-position: -540px -400px; } .emoji-1F461 { background-position: -540px -420px; } .emoji-1F462 { background-position: -540px -440px; } .emoji-1F463 { background-position: -540px -460px; } .emoji-1F464 { background-position: -540px -480px; } .emoji-1F465 { background-position: -540px -500px; } .emoji-1F466 { background-position: -540px -520px; } .emoji-1F466-1F3FB { background-position: 0px -540px; } .emoji-1F466-1F3FC { background-position: -20px -540px; } .emoji-1F466-1F3FD { background-position: -40px -540px; } .emoji-1F466-1F3FE { background-position: -60px -540px; } .emoji-1F466-1F3FF { background-position: -80px -540px; } .emoji-1F467 { background-position: -100px -540px; } .emoji-1F467-1F3FB { background-position: -120px -540px; } .emoji-1F467-1F3FC { background-position: -140px -540px; } .emoji-1F467-1F3FD { background-position: -160px -540px; } .emoji-1F467-1F3FE { background-position: -180px -540px; } .emoji-1F467-1F3FF { background-position: -200px -540px; } .emoji-1F468 { background-position: -220px -540px; } .emoji-1F468-1F3FB { background-position: -240px -540px; } .emoji-1F468-1F3FC { background-position: -260px -540px; } .emoji-1F468-1F3FD { background-position: -280px -540px; } .emoji-1F468-1F3FE { background-position: -300px -540px; } .emoji-1F468-1F3FF { background-position: -320px -540px; } .emoji-1F468-1F468-1F466 { background-position: -340px -540px; } .emoji-1F468-1F468-1F466-1F466 { background-position: -360px -540px; } .emoji-1F468-1F468-1F467 { background-position: -380px -540px; } .emoji-1F468-1F468-1F467-1F466 { background-position: -400px -540px; } .emoji-1F468-1F468-1F467-1F467 { background-position: -420px -540px; } .emoji-1F468-1F469-1F466-1F466 { background-position: -440px -540px; } .emoji-1F468-1F469-1F467 { background-position: -460px -540px; } .emoji-1F468-1F469-1F467-1F466 { background-position: -480px -540px; } .emoji-1F468-1F469-1F467-1F467 { background-position: -500px -540px; } .emoji-1F468-2764-1F468 { background-position: -520px -540px; } .emoji-1F468-2764-1F48B-1F468 { background-position: -540px -540px; } .emoji-1F469 { background-position: -560px 0px; } .emoji-1F469-1F3FB { background-position: -560px -20px; } .emoji-1F469-1F3FC { background-position: -560px -40px; } .emoji-1F469-1F3FD { background-position: -560px -60px; } .emoji-1F469-1F3FE { background-position: -560px -80px; } .emoji-1F469-1F3FF { background-position: -560px -100px; } .emoji-1F469-1F469-1F466 { background-position: -560px -120px; } .emoji-1F469-1F469-1F466-1F466 { background-position: -560px -140px; } .emoji-1F469-1F469-1F467 { background-position: -560px -160px; } .emoji-1F469-1F469-1F467-1F466 { background-position: -560px -180px; } .emoji-1F469-1F469-1F467-1F467 { background-position: -560px -200px; } .emoji-1F469-2764-1F469 { background-position: -560px -220px; } .emoji-1F469-2764-1F48B-1F469 { background-position: -560px -240px; } .emoji-1F46A { background-position: -560px -260px; } .emoji-1F46B { background-position: -560px -280px; } .emoji-1F46C { background-position: -560px -300px; } .emoji-1F46D { background-position: -560px -320px; } .emoji-1F46E { background-position: -560px -340px; } .emoji-1F46E-1F3FB { background-position: -560px -360px; } .emoji-1F46E-1F3FC { background-position: -560px -380px; } .emoji-1F46E-1F3FD { background-position: -560px -400px; } .emoji-1F46E-1F3FE { background-position: -560px -420px; } .emoji-1F46E-1F3FF { background-position: -560px -440px; } .emoji-1F46F { background-position: -560px -460px; } .emoji-1F470 { background-position: -560px -480px; } .emoji-1F470-1F3FB { background-position: -560px -500px; } .emoji-1F470-1F3FC { background-position: -560px -520px; } .emoji-1F470-1F3FD { background-position: -560px -540px; } .emoji-1F470-1F3FE { background-position: 0px -560px; } .emoji-1F470-1F3FF { background-position: -20px -560px; } .emoji-1F471 { background-position: -40px -560px; } .emoji-1F471-1F3FB { background-position: -60px -560px; } .emoji-1F471-1F3FC { background-position: -80px -560px; } .emoji-1F471-1F3FD { background-position: -100px -560px; } .emoji-1F471-1F3FE { background-position: -120px -560px; } .emoji-1F471-1F3FF { background-position: -140px -560px; } .emoji-1F472 { background-position: -160px -560px; } .emoji-1F472-1F3FB { background-position: -180px -560px; } .emoji-1F472-1F3FC { background-position: -200px -560px; } .emoji-1F472-1F3FD { background-position: -220px -560px; } .emoji-1F472-1F3FE { background-position: -240px -560px; } .emoji-1F472-1F3FF { background-position: -260px -560px; } .emoji-1F473 { background-position: -280px -560px; } .emoji-1F473-1F3FB { background-position: -300px -560px; } .emoji-1F473-1F3FC { background-position: -320px -560px; } .emoji-1F473-1F3FD { background-position: -340px -560px; } .emoji-1F473-1F3FE { background-position: -360px -560px; } .emoji-1F473-1F3FF { background-position: -380px -560px; } .emoji-1F474 { background-position: -400px -560px; } .emoji-1F474-1F3FB { background-position: -420px -560px; } .emoji-1F474-1F3FC { background-position: -440px -560px; } .emoji-1F474-1F3FD { background-position: -460px -560px; } .emoji-1F474-1F3FE { background-position: -480px -560px; } .emoji-1F474-1F3FF { background-position: -500px -560px; } .emoji-1F475 { background-position: -520px -560px; } .emoji-1F475-1F3FB { background-position: -540px -560px; } .emoji-1F475-1F3FC { background-position: -560px -560px; } .emoji-1F475-1F3FD { background-position: -580px 0px; } .emoji-1F475-1F3FE { background-position: -580px -20px; } .emoji-1F475-1F3FF { background-position: -580px -40px; } .emoji-1F476 { background-position: -580px -60px; } .emoji-1F476-1F3FB { background-position: -580px -80px; } .emoji-1F476-1F3FC { background-position: -580px -100px; } .emoji-1F476-1F3FD { background-position: -580px -120px; } .emoji-1F476-1F3FE { background-position: -580px -140px; } .emoji-1F476-1F3FF { background-position: -580px -160px; } .emoji-1F477 { background-position: -580px -180px; } .emoji-1F477-1F3FB { background-position: -580px -200px; } .emoji-1F477-1F3FC { background-position: -580px -220px; } .emoji-1F477-1F3FD { background-position: -580px -240px; } .emoji-1F477-1F3FE { background-position: -580px -260px; } .emoji-1F477-1F3FF { background-position: -580px -280px; } .emoji-1F478 { background-position: -580px -300px; } .emoji-1F478-1F3FB { background-position: -580px -320px; } .emoji-1F478-1F3FC { background-position: -580px -340px; } .emoji-1F478-1F3FD { background-position: -580px -360px; } .emoji-1F478-1F3FE { background-position: -580px -380px; } .emoji-1F478-1F3FF { background-position: -580px -400px; } .emoji-1F479 { background-position: -580px -420px; } .emoji-1F47A { background-position: -580px -440px; } .emoji-1F47B { background-position: -580px -460px; } .emoji-1F47C { background-position: -580px -480px; } .emoji-1F47C-1F3FB { background-position: -580px -500px; } .emoji-1F47C-1F3FC { background-position: -580px -520px; } .emoji-1F47C-1F3FD { background-position: -580px -540px; } .emoji-1F47C-1F3FE { background-position: -580px -560px; } .emoji-1F47C-1F3FF { background-position: 0px -580px; } .emoji-1F47D { background-position: -20px -580px; } .emoji-1F47E { background-position: -40px -580px; } .emoji-1F47F { background-position: -60px -580px; } .emoji-1F480 { background-position: -80px -580px; } .emoji-1F481 { background-position: -100px -580px; } .emoji-1F481-1F3FB { background-position: -120px -580px; } .emoji-1F481-1F3FC { background-position: -140px -580px; } .emoji-1F481-1F3FD { background-position: -160px -580px; } .emoji-1F481-1F3FE { background-position: -180px -580px; } .emoji-1F481-1F3FF { background-position: -200px -580px; } .emoji-1F482 { background-position: -220px -580px; } .emoji-1F482-1F3FB { background-position: -240px -580px; } .emoji-1F482-1F3FC { background-position: -260px -580px; } .emoji-1F482-1F3FD { background-position: -280px -580px; } .emoji-1F482-1F3FE { background-position: -300px -580px; } .emoji-1F482-1F3FF { background-position: -320px -580px; } .emoji-1F483 { background-position: -340px -580px; } .emoji-1F483-1F3FB { background-position: -360px -580px; } .emoji-1F483-1F3FC { background-position: -380px -580px; } .emoji-1F483-1F3FD { background-position: -400px -580px; } .emoji-1F483-1F3FE { background-position: -420px -580px; } .emoji-1F483-1F3FF { background-position: -440px -580px; } .emoji-1F484 { background-position: -460px -580px; } .emoji-1F485 { background-position: -480px -580px; } .emoji-1F485-1F3FB { background-position: -500px -580px; } .emoji-1F485-1F3FC { background-position: -520px -580px; } .emoji-1F485-1F3FD { background-position: -540px -580px; } .emoji-1F485-1F3FE { background-position: -560px -580px; } .emoji-1F485-1F3FF { background-position: -580px -580px; } .emoji-1F486 { background-position: -600px 0px; } .emoji-1F486-1F3FB { background-position: -600px -20px; } .emoji-1F486-1F3FC { background-position: -600px -40px; } .emoji-1F486-1F3FD { background-position: -600px -60px; } .emoji-1F486-1F3FE { background-position: -600px -80px; } .emoji-1F486-1F3FF { background-position: -600px -100px; } .emoji-1F487 { background-position: -600px -120px; } .emoji-1F487-1F3FB { background-position: -600px -140px; } .emoji-1F487-1F3FC { background-position: -600px -160px; } .emoji-1F487-1F3FD { background-position: -600px -180px; } .emoji-1F487-1F3FE { background-position: -600px -200px; } .emoji-1F487-1F3FF { background-position: -600px -220px; } .emoji-1F488 { background-position: -600px -240px; } .emoji-1F489 { background-position: -600px -260px; } .emoji-1F48A { background-position: -600px -280px; } .emoji-1F48B { background-position: -600px -300px; } .emoji-1F48C { background-position: -600px -320px; } .emoji-1F48D { background-position: -600px -340px; } .emoji-1F48E { background-position: -600px -360px; } .emoji-1F48F { background-position: -600px -380px; } .emoji-1F490 { background-position: -600px -400px; } .emoji-1F491 { background-position: -600px -420px; } .emoji-1F492 { background-position: -600px -440px; } .emoji-1F493 { background-position: -600px -460px; } .emoji-1F494 { background-position: -600px -480px; } .emoji-1F495 { background-position: -600px -500px; } .emoji-1F496 { background-position: -600px -520px; } .emoji-1F497 { background-position: -600px -540px; } .emoji-1F498 { background-position: -600px -560px; } .emoji-1F499 { background-position: -600px -580px; } .emoji-1F49A { background-position: 0px -600px; } .emoji-1F49B { background-position: -20px -600px; } .emoji-1F49C { background-position: -40px -600px; } .emoji-1F49D { background-position: -60px -600px; } .emoji-1F49E { background-position: -80px -600px; } .emoji-1F49F { background-position: -100px -600px; } .emoji-1F4A0 { background-position: -120px -600px; } .emoji-1F4A1 { background-position: -140px -600px; } .emoji-1F4A2 { background-position: -160px -600px; } .emoji-1F4A3 { background-position: -180px -600px; } .emoji-1F4A4 { background-position: -200px -600px; } .emoji-1F4A5 { background-position: -220px -600px; } .emoji-1F4A6 { background-position: -240px -600px; } .emoji-1F4A7 { background-position: -260px -600px; } .emoji-1F4A8 { background-position: -280px -600px; } .emoji-1F4A9 { background-position: -300px -600px; } .emoji-1F4AA { background-position: -320px -600px; } .emoji-1F4AA-1F3FB { background-position: -340px -600px; } .emoji-1F4AA-1F3FC { background-position: -360px -600px; } .emoji-1F4AA-1F3FD { background-position: -380px -600px; } .emoji-1F4AA-1F3FE { background-position: -400px -600px; } .emoji-1F4AA-1F3FF { background-position: -420px -600px; } .emoji-1F4AB { background-position: -440px -600px; } .emoji-1F4AC { background-position: -460px -600px; } .emoji-1F4AD { background-position: -480px -600px; } .emoji-1F4AE { background-position: -500px -600px; } .emoji-1F4AF { background-position: -520px -600px; } .emoji-1F4B0 { background-position: -540px -600px; } .emoji-1F4B1 { background-position: -560px -600px; } .emoji-1F4B2 { background-position: -580px -600px; } .emoji-1F4B3 { background-position: -600px -600px; } .emoji-1F4B4 { background-position: -620px 0px; } .emoji-1F4B5 { background-position: -620px -20px; } .emoji-1F4B6 { background-position: -620px -40px; } .emoji-1F4B7 { background-position: -620px -60px; } .emoji-1F4B8 { background-position: -620px -80px; } .emoji-1F4B9 { background-position: -620px -100px; } .emoji-1F4BA { background-position: -620px -120px; } .emoji-1F4BB { background-position: -620px -140px; } .emoji-1F4BC { background-position: -620px -160px; } .emoji-1F4BD { background-position: -620px -180px; } .emoji-1F4BE { background-position: -620px -200px; } .emoji-1F4BF { background-position: -620px -220px; } .emoji-1F4C0 { background-position: -620px -240px; } .emoji-1F4C1 { background-position: -620px -260px; } .emoji-1F4C2 { background-position: -620px -280px; } .emoji-1F4C3 { background-position: -620px -300px; } .emoji-1F4C4 { background-position: -620px -320px; } .emoji-1F4C5 { background-position: -620px -340px; } .emoji-1F4C6 { background-position: -620px -360px; } .emoji-1F4C7 { background-position: -620px -380px; } .emoji-1F4C8 { background-position: -620px -400px; } .emoji-1F4C9 { background-position: -620px -420px; } .emoji-1F4CA { background-position: -620px -440px; } .emoji-1F4CB { background-position: -620px -460px; } .emoji-1F4CC { background-position: -620px -480px; } .emoji-1F4CD { background-position: -620px -500px; } .emoji-1F4CE { background-position: -620px -520px; } .emoji-1F4CF { background-position: -620px -540px; } .emoji-1F4D0 { background-position: -620px -560px; } .emoji-1F4D1 { background-position: -620px -580px; } .emoji-1F4D2 { background-position: -620px -600px; } .emoji-1F4D3 { background-position: 0px -620px; } .emoji-1F4D4 { background-position: -20px -620px; } .emoji-1F4D5 { background-position: -40px -620px; } .emoji-1F4D6 { background-position: -60px -620px; } .emoji-1F4D7 { background-position: -80px -620px; } .emoji-1F4D8 { background-position: -100px -620px; } .emoji-1F4D9 { background-position: -120px -620px; } .emoji-1F4DA { background-position: -140px -620px; } .emoji-1F4DB { background-position: -160px -620px; } .emoji-1F4DC { background-position: -180px -620px; } .emoji-1F4DD { background-position: -200px -620px; } .emoji-1F4DE { background-position: -220px -620px; } .emoji-1F4DF { background-position: -240px -620px; } .emoji-1F4E0 { background-position: -260px -620px; } .emoji-1F4E1 { background-position: -280px -620px; } .emoji-1F4E2 { background-position: -300px -620px; } .emoji-1F4E3 { background-position: -320px -620px; } .emoji-1F4E4 { background-position: -340px -620px; } .emoji-1F4E5 { background-position: -360px -620px; } .emoji-1F4E6 { background-position: -380px -620px; } .emoji-1F4E7 { background-position: -400px -620px; } .emoji-1F4E8 { background-position: -420px -620px; } .emoji-1F4E9 { background-position: -440px -620px; } .emoji-1F4EA { background-position: -460px -620px; } .emoji-1F4EB { background-position: -480px -620px; } .emoji-1F4EC { background-position: -500px -620px; } .emoji-1F4ED { background-position: -520px -620px; } .emoji-1F4EE { background-position: -540px -620px; } .emoji-1F4EF { background-position: -560px -620px; } .emoji-1F4F0 { background-position: -580px -620px; } .emoji-1F4F1 { background-position: -600px -620px; } .emoji-1F4F2 { background-position: -620px -620px; } .emoji-1F4F3 { background-position: -640px 0px; } .emoji-1F4F4 { background-position: -640px -20px; } .emoji-1F4F5 { background-position: -640px -40px; } .emoji-1F4F6 { background-position: -640px -60px; } .emoji-1F4F7 { background-position: -640px -80px; } .emoji-1F4F8 { background-position: -640px -100px; } .emoji-1F4F9 { background-position: -640px -120px; } .emoji-1F4FA { background-position: -640px -140px; } .emoji-1F4FB { background-position: -640px -160px; } .emoji-1F4FC { background-position: -640px -180px; } .emoji-1F4FD { background-position: -640px -200px; } .emoji-1F4FE { background-position: -640px -220px; } .emoji-1F4FF { background-position: -640px -240px; } .emoji-1F500 { background-position: -640px -260px; } .emoji-1F501 { background-position: -640px -280px; } .emoji-1F502 { background-position: -640px -300px; } .emoji-1F503 { background-position: -640px -320px; } .emoji-1F504 { background-position: -640px -340px; } .emoji-1F505 { background-position: -640px -360px; } .emoji-1F506 { background-position: -640px -380px; } .emoji-1F507 { background-position: -640px -400px; } .emoji-1F508 { background-position: -640px -420px; } .emoji-1F509 { background-position: -640px -440px; } .emoji-1F50A { background-position: -640px -460px; } .emoji-1F50B { background-position: -640px -480px; } .emoji-1F50C { background-position: -640px -500px; } .emoji-1F50D { background-position: -640px -520px; } .emoji-1F50E { background-position: -640px -540px; } .emoji-1F50F { background-position: -640px -560px; } .emoji-1F510 { background-position: -640px -580px; } .emoji-1F511 { background-position: -640px -600px; } .emoji-1F512 { background-position: -640px -620px; } .emoji-1F513 { background-position: 0px -640px; } .emoji-1F514 { background-position: -20px -640px; } .emoji-1F515 { background-position: -40px -640px; } .emoji-1F516 { background-position: -60px -640px; } .emoji-1F517 { background-position: -80px -640px; } .emoji-1F518 { background-position: -100px -640px; } .emoji-1F519 { background-position: -120px -640px; } .emoji-1F51A { background-position: -140px -640px; } .emoji-1F51B { background-position: -160px -640px; } .emoji-1F51C { background-position: -180px -640px; } .emoji-1F51D { background-position: -200px -640px; } .emoji-1F51E { background-position: -220px -640px; } .emoji-1F51F { background-position: -240px -640px; } .emoji-1F520 { background-position: -260px -640px; } .emoji-1F521 { background-position: -280px -640px; } .emoji-1F522 { background-position: -300px -640px; } .emoji-1F523 { background-position: -320px -640px; } .emoji-1F524 { background-position: -340px -640px; } .emoji-1F525 { background-position: -360px -640px; } .emoji-1F526 { background-position: -380px -640px; } .emoji-1F527 { background-position: -400px -640px; } .emoji-1F528 { background-position: -420px -640px; } .emoji-1F529 { background-position: -440px -640px; } .emoji-1F52A { background-position: -460px -640px; } .emoji-1F52B { background-position: -480px -640px; } .emoji-1F52C { background-position: -500px -640px; } .emoji-1F52D { background-position: -520px -640px; } .emoji-1F52E { background-position: -540px -640px; } .emoji-1F52F { background-position: -560px -640px; } .emoji-1F530 { background-position: -580px -640px; } .emoji-1F531 { background-position: -600px -640px; } .emoji-1F532 { background-position: -620px -640px; } .emoji-1F533 { background-position: -640px -640px; } .emoji-1F534 { background-position: -660px 0px; } .emoji-1F535 { background-position: -660px -20px; } .emoji-1F536 { background-position: -660px -40px; } .emoji-1F537 { background-position: -660px -60px; } .emoji-1F538 { background-position: -660px -80px; } .emoji-1F539 { background-position: -660px -100px; } .emoji-1F53A { background-position: -660px -120px; } .emoji-1F53B { background-position: -660px -140px; } .emoji-1F53C { background-position: -660px -160px; } .emoji-1F53D { background-position: -660px -180px; } .emoji-1F546 { background-position: -660px -200px; } .emoji-1F547 { background-position: -660px -220px; } .emoji-1F548 { background-position: -660px -240px; } .emoji-1F549 { background-position: -660px -260px; } .emoji-1F54A { background-position: -660px -280px; } .emoji-1F54B { background-position: -660px -300px; } .emoji-1F54C { background-position: -660px -320px; } .emoji-1F54D { background-position: -660px -340px; } .emoji-1F54E { background-position: -660px -360px; } .emoji-1F550 { background-position: -660px -380px; } .emoji-1F551 { background-position: -660px -400px; } .emoji-1F552 { background-position: -660px -420px; } .emoji-1F553 { background-position: -660px -440px; } .emoji-1F554 { background-position: -660px -460px; } .emoji-1F555 { background-position: -660px -480px; } .emoji-1F556 { background-position: -660px -500px; } .emoji-1F557 { background-position: -660px -520px; } .emoji-1F558 { background-position: -660px -540px; } .emoji-1F559 { background-position: -660px -560px; } .emoji-1F55A { background-position: -660px -580px; } .emoji-1F55B { background-position: -660px -600px; } .emoji-1F55C { background-position: -660px -620px; } .emoji-1F55D { background-position: -660px -640px; } .emoji-1F55E { background-position: 0px -660px; } .emoji-1F55F { background-position: -20px -660px; } .emoji-1F560 { background-position: -40px -660px; } .emoji-1F561 { background-position: -60px -660px; } .emoji-1F562 { background-position: -80px -660px; } .emoji-1F563 { background-position: -100px -660px; } .emoji-1F564 { background-position: -120px -660px; } .emoji-1F565 { background-position: -140px -660px; } .emoji-1F566 { background-position: -160px -660px; } .emoji-1F567 { background-position: -180px -660px; } .emoji-1F568 { background-position: -200px -660px; } .emoji-1F569 { background-position: -220px -660px; } .emoji-1F56A { background-position: -240px -660px; } .emoji-1F56B { background-position: -260px -660px; } .emoji-1F56C { background-position: -280px -660px; } .emoji-1F56D { background-position: -300px -660px; } .emoji-1F56E { background-position: -320px -660px; } .emoji-1F56F { background-position: -340px -660px; } .emoji-1F570 { background-position: -360px -660px; } .emoji-1F571 { background-position: -380px -660px; } .emoji-1F572 { background-position: -400px -660px; } .emoji-1F573 { background-position: -420px -660px; } .emoji-1F574 { background-position: -440px -660px; } .emoji-1F575 { background-position: -460px -660px; } .emoji-1F575-1F3FB { background-position: -480px -660px; } .emoji-1F575-1F3FC { background-position: -500px -660px; } .emoji-1F575-1F3FD { background-position: -520px -660px; } .emoji-1F575-1F3FE { background-position: -540px -660px; } .emoji-1F575-1F3FF { background-position: -560px -660px; } .emoji-1F576 { background-position: -580px -660px; } .emoji-1F577 { background-position: -600px -660px; } .emoji-1F578 { background-position: -620px -660px; } .emoji-1F579 { background-position: -640px -660px; } .emoji-1F57B { background-position: -660px -660px; } .emoji-1F57E { background-position: -680px 0px; } .emoji-1F57F { background-position: -680px -20px; } .emoji-1F581 { background-position: -680px -40px; } .emoji-1F582 { background-position: -680px -60px; } .emoji-1F583 { background-position: -680px -80px; } .emoji-1F585 { background-position: -680px -100px; } .emoji-1F586 { background-position: -680px -120px; } .emoji-1F587 { background-position: -680px -140px; } .emoji-1F588 { background-position: -680px -160px; } .emoji-1F589 { background-position: -680px -180px; } .emoji-1F58A { background-position: -680px -200px; } .emoji-1F58B { background-position: -680px -220px; } .emoji-1F58C { background-position: -680px -240px; } .emoji-1F58D { background-position: -680px -260px; } .emoji-1F58E { background-position: -680px -280px; } .emoji-1F58F { background-position: -680px -300px; } .emoji-1F590 { background-position: -680px -320px; } .emoji-1F590-1F3FB { background-position: -680px -340px; } .emoji-1F590-1F3FC { background-position: -680px -360px; } .emoji-1F590-1F3FD { background-position: -680px -380px; } .emoji-1F590-1F3FE { background-position: -680px -400px; } .emoji-1F590-1F3FF { background-position: -680px -420px; } .emoji-1F591 { background-position: -680px -440px; } .emoji-1F592 { background-position: -680px -460px; } .emoji-1F593 { background-position: -680px -480px; } .emoji-1F594 { background-position: -680px -500px; } .emoji-1F595 { background-position: -680px -520px; } .emoji-1F595-1F3FB { background-position: -680px -540px; } .emoji-1F595-1F3FC { background-position: -680px -560px; } .emoji-1F595-1F3FD { background-position: -680px -580px; } .emoji-1F595-1F3FE { background-position: -680px -600px; } .emoji-1F595-1F3FF { background-position: -680px -620px; } .emoji-1F596 { background-position: -680px -640px; } .emoji-1F596-1F3FB { background-position: -680px -660px; } .emoji-1F596-1F3FC { background-position: 0px -680px; } .emoji-1F596-1F3FD { background-position: -20px -680px; } .emoji-1F596-1F3FE { background-position: -40px -680px; } .emoji-1F596-1F3FF { background-position: -60px -680px; } .emoji-1F597 { background-position: -80px -680px; } .emoji-1F598 { background-position: -100px -680px; } .emoji-1F599 { background-position: -120px -680px; } .emoji-1F59E { background-position: -140px -680px; } .emoji-1F59F { background-position: -160px -680px; } .emoji-1F5A5 { background-position: -180px -680px; } .emoji-1F5A6 { background-position: -200px -680px; } .emoji-1F5A7 { background-position: -220px -680px; } .emoji-1F5A8 { background-position: -240px -680px; } .emoji-1F5A9 { background-position: -260px -680px; } .emoji-1F5AA { background-position: -280px -680px; } .emoji-1F5AB { background-position: -300px -680px; } .emoji-1F5AD { background-position: -320px -680px; } .emoji-1F5AE { background-position: -340px -680px; } .emoji-1F5AF { background-position: -360px -680px; } .emoji-1F5B1 { background-position: -380px -680px; } .emoji-1F5B2 { background-position: -400px -680px; } .emoji-1F5B3 { background-position: -420px -680px; } .emoji-1F5B4 { background-position: -440px -680px; } .emoji-1F5B8 { background-position: -460px -680px; } .emoji-1F5B9 { background-position: -480px -680px; } .emoji-1F5BC { background-position: -500px -680px; } .emoji-1F5BD { background-position: -520px -680px; } .emoji-1F5BE { background-position: -540px -680px; } .emoji-1F5C0 { background-position: -560px -680px; } .emoji-1F5C1 { background-position: -580px -680px; } .emoji-1F5C2 { background-position: -600px -680px; } .emoji-1F5C3 { background-position: -620px -680px; } .emoji-1F5C4 { background-position: -640px -680px; } .emoji-1F5C6 { background-position: -660px -680px; } .emoji-1F5C7 { background-position: -680px -680px; } .emoji-1F5C9 { background-position: -700px 0px; } .emoji-1F5CA { background-position: -700px -20px; } .emoji-1F5CE { background-position: -700px -40px; } .emoji-1F5CF { background-position: -700px -60px; } .emoji-1F5D0 { background-position: -700px -80px; } .emoji-1F5D1 { background-position: -700px -100px; } .emoji-1F5D2 { background-position: -700px -120px; } .emoji-1F5D3 { background-position: -700px -140px; } .emoji-1F5D4 { background-position: -700px -160px; } .emoji-1F5D8 { background-position: -700px -180px; } .emoji-1F5D9 { background-position: -700px -200px; } .emoji-1F5DC { background-position: -700px -220px; } .emoji-1F5DD { background-position: -700px -240px; } .emoji-1F5DE { background-position: -700px -260px; } .emoji-1F5E0 { background-position: -700px -280px; } .emoji-1F5E1 { background-position: -700px -300px; } .emoji-1F5E2 { background-position: -700px -320px; } .emoji-1F5E3 { background-position: -700px -340px; } .emoji-1F5E8 { background-position: -700px -360px; } .emoji-1F5E9 { background-position: -700px -380px; } .emoji-1F5EA { background-position: -700px -400px; } .emoji-1F5EB { background-position: -700px -420px; } .emoji-1F5EC { background-position: -700px -440px; } .emoji-1F5ED { background-position: -700px -460px; } .emoji-1F5EE { background-position: -700px -480px; } .emoji-1F5EF { background-position: -700px -500px; } .emoji-1F5F0 { background-position: -700px -520px; } .emoji-1F5F1 { background-position: -700px -540px; } .emoji-1F5F2 { background-position: -700px -560px; } .emoji-1F5F3 { background-position: -700px -580px; } .emoji-1F5F4 { background-position: -700px -600px; } .emoji-1F5F5 { background-position: -700px -620px; } .emoji-1F5F8 { background-position: -700px -640px; } .emoji-1F5F9 { background-position: -700px -660px; } .emoji-1F5FA { background-position: -700px -680px; } .emoji-1F5FB { background-position: 0px -700px; } .emoji-1F5FC { background-position: -20px -700px; } .emoji-1F5FD { background-position: -40px -700px; } .emoji-1F5FE { background-position: -60px -700px; } .emoji-1F5FF { background-position: -80px -700px; } .emoji-1F600 { background-position: -100px -700px; } .emoji-1F601 { background-position: -120px -700px; } .emoji-1F602 { background-position: -140px -700px; } .emoji-1F603 { background-position: -160px -700px; } .emoji-1F604 { background-position: -180px -700px; } .emoji-1F605 { background-position: -200px -700px; } .emoji-1F606 { background-position: -220px -700px; } .emoji-1F607 { background-position: -240px -700px; } .emoji-1F608 { background-position: -260px -700px; } .emoji-1F609 { background-position: -280px -700px; } .emoji-1F60A { background-position: -300px -700px; } .emoji-1F60B { background-position: -320px -700px; } .emoji-1F60C { background-position: -340px -700px; } .emoji-1F60D { background-position: -360px -700px; } .emoji-1F60E { background-position: -380px -700px; } .emoji-1F60F { background-position: -400px -700px; } .emoji-1F610 { background-position: -420px -700px; } .emoji-1F611 { background-position: -440px -700px; } .emoji-1F612 { background-position: -460px -700px; } .emoji-1F613 { background-position: -480px -700px; } .emoji-1F614 { background-position: -500px -700px; } .emoji-1F615 { background-position: -520px -700px; } .emoji-1F616 { background-position: -540px -700px; } .emoji-1F617 { background-position: -560px -700px; } .emoji-1F618 { background-position: -580px -700px; } .emoji-1F619 { background-position: -600px -700px; } .emoji-1F61A { background-position: -620px -700px; } .emoji-1F61B { background-position: -640px -700px; } .emoji-1F61C { background-position: -660px -700px; } .emoji-1F61D { background-position: -680px -700px; } .emoji-1F61E { background-position: -700px -700px; } .emoji-1F61F { background-position: -720px 0px; } .emoji-1F620 { background-position: -720px -20px; } .emoji-1F621 { background-position: -720px -40px; } .emoji-1F622 { background-position: -720px -60px; } .emoji-1F623 { background-position: -720px -80px; } .emoji-1F624 { background-position: -720px -100px; } .emoji-1F625 { background-position: -720px -120px; } .emoji-1F626 { background-position: -720px -140px; } .emoji-1F627 { background-position: -720px -160px; } .emoji-1F628 { background-position: -720px -180px; } .emoji-1F629 { background-position: -720px -200px; } .emoji-1F62A { background-position: -720px -220px; } .emoji-1F62B { background-position: -720px -240px; } .emoji-1F62C { background-position: -720px -260px; } .emoji-1F62D { background-position: -720px -280px; } .emoji-1F62E { background-position: -720px -300px; } .emoji-1F62F { background-position: -720px -320px; } .emoji-1F630 { background-position: -720px -340px; } .emoji-1F631 { background-position: -720px -360px; } .emoji-1F632 { background-position: -720px -380px; } .emoji-1F633 { background-position: -720px -400px; } .emoji-1F634 { background-position: -720px -420px; } .emoji-1F635 { background-position: -720px -440px; } .emoji-1F636 { background-position: -720px -460px; } .emoji-1F637 { background-position: -720px -480px; } .emoji-1F638 { background-position: -720px -500px; } .emoji-1F639 { background-position: -720px -520px; } .emoji-1F63A { background-position: -720px -540px; } .emoji-1F63B { background-position: -720px -560px; } .emoji-1F63C { background-position: -720px -580px; } .emoji-1F63D { background-position: -720px -600px; } .emoji-1F63E { background-position: -720px -620px; } .emoji-1F63F { background-position: -720px -640px; } .emoji-1F640 { background-position: -720px -660px; } .emoji-1F641 { background-position: -720px -680px; } .emoji-1F642 { background-position: -720px -700px; } .emoji-1F643 { background-position: 0px -720px; } .emoji-1F644 { background-position: -20px -720px; } .emoji-1F645 { background-position: -40px -720px; } .emoji-1F645-1F3FB { background-position: -60px -720px; } .emoji-1F645-1F3FC { background-position: -80px -720px; } .emoji-1F645-1F3FD { background-position: -100px -720px; } .emoji-1F645-1F3FE { background-position: -120px -720px; } .emoji-1F645-1F3FF { background-position: -140px -720px; } .emoji-1F646 { background-position: -160px -720px; } .emoji-1F646-1F3FB { background-position: -180px -720px; } .emoji-1F646-1F3FC { background-position: -200px -720px; } .emoji-1F646-1F3FD { background-position: -220px -720px; } .emoji-1F646-1F3FE { background-position: -240px -720px; } .emoji-1F646-1F3FF { background-position: -260px -720px; } .emoji-1F647 { background-position: -280px -720px; } .emoji-1F647-1F3FB { background-position: -300px -720px; } .emoji-1F647-1F3FC { background-position: -320px -720px; } .emoji-1F647-1F3FD { background-position: -340px -720px; } .emoji-1F647-1F3FE { background-position: -360px -720px; } .emoji-1F647-1F3FF { background-position: -380px -720px; } .emoji-1F648 { background-position: -400px -720px; } .emoji-1F649 { background-position: -420px -720px; } .emoji-1F64A { background-position: -440px -720px; } .emoji-1F64B { background-position: -460px -720px; } .emoji-1F64B-1F3FB { background-position: -480px -720px; } .emoji-1F64B-1F3FC { background-position: -500px -720px; } .emoji-1F64B-1F3FD { background-position: -520px -720px; } .emoji-1F64B-1F3FE { background-position: -540px -720px; } .emoji-1F64B-1F3FF { background-position: -560px -720px; } .emoji-1F64C { background-position: -580px -720px; } .emoji-1F64C-1F3FB { background-position: -600px -720px; } .emoji-1F64C-1F3FC { background-position: -620px -720px; } .emoji-1F64C-1F3FD { background-position: -640px -720px; } .emoji-1F64C-1F3FE { background-position: -660px -720px; } .emoji-1F64C-1F3FF { background-position: -680px -720px; } .emoji-1F64D { background-position: -700px -720px; } .emoji-1F64D-1F3FB { background-position: -720px -720px; } .emoji-1F64D-1F3FC { background-position: -740px 0px; } .emoji-1F64D-1F3FD { background-position: -740px -20px; } .emoji-1F64D-1F3FE { background-position: -740px -40px; } .emoji-1F64D-1F3FF { background-position: -740px -60px; } .emoji-1F64E { background-position: -740px -80px; } .emoji-1F64E-1F3FB { background-position: -740px -100px; } .emoji-1F64E-1F3FC { background-position: -740px -120px; } .emoji-1F64E-1F3FD { background-position: -740px -140px; } .emoji-1F64E-1F3FE { background-position: -740px -160px; } .emoji-1F64E-1F3FF { background-position: -740px -180px; } .emoji-1F64F { background-position: -740px -200px; } .emoji-1F64F-1F3FB { background-position: -740px -220px; } .emoji-1F64F-1F3FC { background-position: -740px -240px; } .emoji-1F64F-1F3FD { background-position: -740px -260px; } .emoji-1F64F-1F3FE { background-position: -740px -280px; } .emoji-1F64F-1F3FF { background-position: -740px -300px; } .emoji-1F680 { background-position: -740px -320px; } .emoji-1F681 { background-position: -740px -340px; } .emoji-1F682 { background-position: -740px -360px; } .emoji-1F683 { background-position: -740px -380px; } .emoji-1F684 { background-position: -740px -400px; } .emoji-1F685 { background-position: -740px -420px; } .emoji-1F686 { background-position: -740px -440px; } .emoji-1F687 { background-position: -740px -460px; } .emoji-1F688 { background-position: -740px -480px; } .emoji-1F689 { background-position: -740px -500px; } .emoji-1F68A { background-position: -740px -520px; } .emoji-1F68B { background-position: -740px -540px; } .emoji-1F68C { background-position: -740px -560px; } .emoji-1F68D { background-position: -740px -580px; } .emoji-1F68E { background-position: -740px -600px; } .emoji-1F68F { background-position: -740px -620px; } .emoji-1F690 { background-position: -740px -640px; } .emoji-1F691 { background-position: -740px -660px; } .emoji-1F692 { background-position: -740px -680px; } .emoji-1F693 { background-position: -740px -700px; } .emoji-1F694 { background-position: -740px -720px; } .emoji-1F695 { background-position: 0px -740px; } .emoji-1F696 { background-position: -20px -740px; } .emoji-1F697 { background-position: -40px -740px; } .emoji-1F698 { background-position: -60px -740px; } .emoji-1F699 { background-position: -80px -740px; } .emoji-1F69A { background-position: -100px -740px; } .emoji-1F69B { background-position: -120px -740px; } .emoji-1F69C { background-position: -140px -740px; } .emoji-1F69D { background-position: -160px -740px; } .emoji-1F69E { background-position: -180px -740px; } .emoji-1F69F { background-position: -200px -740px; } .emoji-1F6A0 { background-position: -220px -740px; } .emoji-1F6A1 { background-position: -240px -740px; } .emoji-1F6A2 { background-position: -260px -740px; } .emoji-1F6A3 { background-position: -280px -740px; } .emoji-1F6A3-1F3FB { background-position: -300px -740px; } .emoji-1F6A3-1F3FC { background-position: -320px -740px; } .emoji-1F6A3-1F3FD { background-position: -340px -740px; } .emoji-1F6A3-1F3FE { background-position: -360px -740px; } .emoji-1F6A3-1F3FF { background-position: -380px -740px; } .emoji-1F6A4 { background-position: -400px -740px; } .emoji-1F6A5 { background-position: -420px -740px; } .emoji-1F6A6 { background-position: -440px -740px; } .emoji-1F6A7 { background-position: -460px -740px; } .emoji-1F6A8 { background-position: -480px -740px; } .emoji-1F6A9 { background-position: -500px -740px; } .emoji-1F6AA { background-position: -520px -740px; } .emoji-1F6AB { background-position: -540px -740px; } .emoji-1F6AC { background-position: -560px -740px; } .emoji-1F6AD { background-position: -580px -740px; } .emoji-1F6AE { background-position: -600px -740px; } .emoji-1F6AF { background-position: -620px -740px; } .emoji-1F6B0 { background-position: -640px -740px; } .emoji-1F6B1 { background-position: -660px -740px; } .emoji-1F6B2 { background-position: -680px -740px; } .emoji-1F6B3 { background-position: -700px -740px; } .emoji-1F6B4 { background-position: -720px -740px; } .emoji-1F6B4-1F3FB { background-position: -740px -740px; } .emoji-1F6B4-1F3FC { background-position: -760px 0px; } .emoji-1F6B4-1F3FD { background-position: -760px -20px; } .emoji-1F6B4-1F3FE { background-position: -760px -40px; } .emoji-1F6B4-1F3FF { background-position: -760px -60px; } .emoji-1F6B5 { background-position: -760px -80px; } .emoji-1F6B5-1F3FB { background-position: -760px -100px; } .emoji-1F6B5-1F3FC { background-position: -760px -120px; } .emoji-1F6B5-1F3FD { background-position: -760px -140px; } .emoji-1F6B5-1F3FE { background-position: -760px -160px; } .emoji-1F6B5-1F3FF { background-position: -760px -180px; } .emoji-1F6B6 { background-position: -760px -200px; } .emoji-1F6B6-1F3FB { background-position: -760px -220px; } .emoji-1F6B6-1F3FC { background-position: -760px -240px; } .emoji-1F6B6-1F3FD { background-position: -760px -260px; } .emoji-1F6B6-1F3FE { background-position: -760px -280px; } .emoji-1F6B6-1F3FF { background-position: -760px -300px; } .emoji-1F6B7 { background-position: -760px -320px; } .emoji-1F6B8 { background-position: -760px -340px; } .emoji-1F6B9 { background-position: -760px -360px; } .emoji-1F6BA { background-position: -760px -380px; } .emoji-1F6BB { background-position: -760px -400px; } .emoji-1F6BC { background-position: -760px -420px; } .emoji-1F6BD { background-position: -760px -440px; } .emoji-1F6BE { background-position: -760px -460px; } .emoji-1F6BF { background-position: -760px -480px; } .emoji-1F6C0 { background-position: -760px -500px; } .emoji-1F6C0-1F3FB { background-position: -760px -520px; } .emoji-1F6C0-1F3FC { background-position: -760px -540px; } .emoji-1F6C0-1F3FD { background-position: -760px -560px; } .emoji-1F6C0-1F3FE { background-position: -760px -580px; } .emoji-1F6C0-1F3FF { background-position: -760px -600px; } .emoji-1F6C1 { background-position: -760px -620px; } .emoji-1F6C2 { background-position: -760px -640px; } .emoji-1F6C3 { background-position: -760px -660px; } .emoji-1F6C4 { background-position: -760px -680px; } .emoji-1F6C5 { background-position: -760px -700px; } .emoji-1F6C6 { background-position: -760px -720px; } .emoji-1F6C7 { background-position: -760px -740px; } .emoji-1F6C8 { background-position: 0px -760px; } .emoji-1F6C9 { background-position: -20px -760px; } .emoji-1F6CA { background-position: -40px -760px; } .emoji-1F6CB { background-position: -60px -760px; } .emoji-1F6CC { background-position: -80px -760px; } .emoji-1F6CD { background-position: -100px -760px; } .emoji-1F6CE { background-position: -120px -760px; } .emoji-1F6CF { background-position: -140px -760px; } .emoji-1F6D0 { background-position: -160px -760px; } .emoji-1F6E0 { background-position: -180px -760px; } .emoji-1F6E1 { background-position: -200px -760px; } .emoji-1F6E2 { background-position: -220px -760px; } .emoji-1F6E3 { background-position: -240px -760px; } .emoji-1F6E4 { background-position: -260px -760px; } .emoji-1F6E5 { background-position: -280px -760px; } .emoji-1F6E6 { background-position: -300px -760px; } .emoji-1F6E7 { background-position: -320px -760px; } .emoji-1F6E8 { background-position: -340px -760px; } .emoji-1F6E9 { background-position: -360px -760px; } .emoji-1F6EA { background-position: -380px -760px; } .emoji-1F6EB { background-position: -400px -760px; } .emoji-1F6EC { background-position: -420px -760px; } .emoji-1F6F0 { background-position: -440px -760px; } .emoji-1F6F1 { background-position: -460px -760px; } .emoji-1F6F2 { background-position: -480px -760px; } .emoji-1F6F3 { background-position: -500px -760px; } .emoji-1F910 { background-position: -520px -760px; } .emoji-1F911 { background-position: -540px -760px; } .emoji-1F912 { background-position: -560px -760px; } .emoji-1F913 { background-position: -580px -760px; } .emoji-1F914 { background-position: -600px -760px; } .emoji-1F915 { background-position: -620px -760px; } .emoji-1F916 { background-position: -640px -760px; } .emoji-1F917 { background-position: -660px -760px; } .emoji-1F918 { background-position: -680px -760px; } .emoji-1F918-1F3FB { background-position: -700px -760px; } .emoji-1F918-1F3FC { background-position: -720px -760px; } .emoji-1F918-1F3FD { background-position: -740px -760px; } .emoji-1F918-1F3FE { background-position: -760px -760px; } .emoji-1F918-1F3FF { background-position: -780px 0px; } .emoji-1F980 { background-position: -780px -20px; } .emoji-1F981 { background-position: -780px -40px; } .emoji-1F982 { background-position: -780px -60px; } .emoji-1F983 { background-position: -780px -80px; } .emoji-1F984 { background-position: -780px -100px; } .emoji-1F9C0 { background-position: -780px -120px; } .emoji-203C { background-position: -780px -140px; } .emoji-2049 { background-position: -780px -160px; } .emoji-2122 { background-position: -780px -180px; } .emoji-2139 { background-position: -780px -200px; } .emoji-2194 { background-position: -780px -220px; } .emoji-2195 { background-position: -780px -240px; } .emoji-2196 { background-position: -780px -260px; } .emoji-2197 { background-position: -780px -280px; } .emoji-2198 { background-position: -780px -300px; } .emoji-2199 { background-position: -780px -320px; } .emoji-21A9 { background-position: -780px -340px; } .emoji-21AA { background-position: -780px -360px; } .emoji-231A { background-position: -780px -380px; } .emoji-231B { background-position: -780px -400px; } .emoji-2328 { background-position: -780px -420px; } .emoji-23E9 { background-position: -780px -440px; } .emoji-23EA { background-position: -780px -460px; } .emoji-23EB { background-position: -780px -480px; } .emoji-23EC { background-position: -780px -500px; } .emoji-23ED { background-position: -780px -520px; } .emoji-23EE { background-position: -780px -540px; } .emoji-23EF { background-position: -780px -560px; } .emoji-23F0 { background-position: -780px -580px; } .emoji-23F1 { background-position: -780px -600px; } .emoji-23F2 { background-position: -780px -620px; } .emoji-23F3 { background-position: -780px -640px; } .emoji-23F8 { background-position: -780px -660px; } .emoji-23F9 { background-position: -780px -680px; } .emoji-23FA { background-position: -780px -700px; } .emoji-24C2 { background-position: -780px -720px; } .emoji-25AA { background-position: -780px -740px; } .emoji-25AB { background-position: -780px -760px; } .emoji-25B6 { background-position: 0px -780px; } .emoji-25C0 { background-position: -20px -780px; } .emoji-25FB { background-position: -40px -780px; } .emoji-25FC { background-position: -60px -780px; } .emoji-25FD { background-position: -80px -780px; } .emoji-25FE { background-position: -100px -780px; } .emoji-2600 { background-position: -120px -780px; } .emoji-2601 { background-position: -140px -780px; } .emoji-2602 { background-position: -160px -780px; } .emoji-2603 { background-position: -180px -780px; } .emoji-2604 { background-position: -200px -780px; } .emoji-260E { background-position: -220px -780px; } .emoji-2611 { background-position: -240px -780px; } .emoji-2614 { background-position: -260px -780px; } .emoji-2615 { background-position: -280px -780px; } .emoji-2618 { background-position: -300px -780px; } .emoji-261D { background-position: -320px -780px; } .emoji-261D-1F3FB { background-position: -340px -780px; } .emoji-261D-1F3FC { background-position: -360px -780px; } .emoji-261D-1F3FD { background-position: -380px -780px; } .emoji-261D-1F3FE { background-position: -400px -780px; } .emoji-261D-1F3FF { background-position: -420px -780px; } .emoji-2620 { background-position: -440px -780px; } .emoji-2622 { background-position: -460px -780px; } .emoji-2623 { background-position: -480px -780px; } .emoji-2626 { background-position: -500px -780px; } .emoji-262A { background-position: -520px -780px; } .emoji-262E { background-position: -540px -780px; } .emoji-262F { background-position: -560px -780px; } .emoji-2638 { background-position: -580px -780px; } .emoji-2639 { background-position: -600px -780px; } .emoji-263A { background-position: -620px -780px; } .emoji-2648 { background-position: -640px -780px; } .emoji-2649 { background-position: -660px -780px; } .emoji-264A { background-position: -680px -780px; } .emoji-264B { background-position: -700px -780px; } .emoji-264C { background-position: -720px -780px; } .emoji-264D { background-position: -740px -780px; } .emoji-264E { background-position: -760px -780px; } .emoji-264F { background-position: -780px -780px; } .emoji-2650 { background-position: -800px 0px; } .emoji-2651 { background-position: -800px -20px; } .emoji-2652 { background-position: -800px -40px; } .emoji-2653 { background-position: -800px -60px; } .emoji-2660 { background-position: -800px -80px; } .emoji-2663 { background-position: -800px -100px; } .emoji-2665 { background-position: -800px -120px; } .emoji-2666 { background-position: -800px -140px; } .emoji-2668 { background-position: -800px -160px; } .emoji-267B { background-position: -800px -180px; } .emoji-267F { background-position: -800px -200px; } .emoji-2692 { background-position: -800px -220px; } .emoji-2693 { background-position: -800px -240px; } .emoji-2694 { background-position: -800px -260px; } .emoji-2696 { background-position: -800px -280px; } .emoji-2697 { background-position: -800px -300px; } .emoji-2699 { background-position: -800px -320px; } .emoji-269B { background-position: -800px -340px; } .emoji-269C { background-position: -800px -360px; } .emoji-26A0 { background-position: -800px -380px; } .emoji-26A1 { background-position: -800px -400px; } .emoji-26AA { background-position: -800px -420px; } .emoji-26AB { background-position: -800px -440px; } .emoji-26B0 { background-position: -800px -460px; } .emoji-26B1 { background-position: -800px -480px; } .emoji-26BD { background-position: -800px -500px; } .emoji-26BE { background-position: -800px -520px; } .emoji-26C4 { background-position: -800px -540px; } .emoji-26C5 { background-position: -800px -560px; } .emoji-26C8 { background-position: -800px -580px; } .emoji-26CE { background-position: -800px -600px; } .emoji-26CF { background-position: -800px -620px; } .emoji-26D1 { background-position: -800px -640px; } .emoji-26D3 { background-position: -800px -660px; } .emoji-26D4 { background-position: -800px -680px; } .emoji-26E9 { background-position: -800px -700px; } .emoji-26EA { background-position: -800px -720px; } .emoji-26F0 { background-position: -800px -740px; } .emoji-26F1 { background-position: -800px -760px; } .emoji-26F2 { background-position: -800px -780px; } .emoji-26F3 { background-position: 0px -800px; } .emoji-26F4 { background-position: -20px -800px; } .emoji-26F5 { background-position: -40px -800px; } .emoji-26F7 { background-position: -60px -800px; } .emoji-26F8 { background-position: -80px -800px; } .emoji-26F9 { background-position: -100px -800px; } .emoji-26F9-1F3FB { background-position: -120px -800px; } .emoji-26F9-1F3FC { background-position: -140px -800px; } .emoji-26F9-1F3FD { background-position: -160px -800px; } .emoji-26F9-1F3FE { background-position: -180px -800px; } .emoji-26F9-1F3FF { background-position: -200px -800px; } .emoji-26FA { background-position: -220px -800px; } .emoji-26FD { background-position: -240px -800px; } .emoji-2702 { background-position: -260px -800px; } .emoji-2705 { background-position: -280px -800px; } .emoji-2708 { background-position: -300px -800px; } .emoji-2709 { background-position: -320px -800px; } .emoji-270A { background-position: -340px -800px; } .emoji-270A-1F3FB { background-position: -360px -800px; } .emoji-270A-1F3FC { background-position: -380px -800px; } .emoji-270A-1F3FD { background-position: -400px -800px; } .emoji-270A-1F3FE { background-position: -420px -800px; } .emoji-270A-1F3FF { background-position: -440px -800px; } .emoji-270B { background-position: -460px -800px; } .emoji-270B-1F3FB { background-position: -480px -800px; } .emoji-270B-1F3FC { background-position: -500px -800px; } .emoji-270B-1F3FD { background-position: -520px -800px; } .emoji-270B-1F3FE { background-position: -540px -800px; } .emoji-270B-1F3FF { background-position: -560px -800px; } .emoji-270C { background-position: -580px -800px; } .emoji-270C-1F3FB { background-position: -600px -800px; } .emoji-270C-1F3FC { background-position: -620px -800px; } .emoji-270C-1F3FD { background-position: -640px -800px; } .emoji-270C-1F3FE { background-position: -660px -800px; } .emoji-270C-1F3FF { background-position: -680px -800px; } .emoji-270D { background-position: -700px -800px; } .emoji-270D-1F3FB { background-position: -720px -800px; } .emoji-270D-1F3FC { background-position: -740px -800px; } .emoji-270D-1F3FD { background-position: -760px -800px; } .emoji-270D-1F3FE { background-position: -780px -800px; } .emoji-270D-1F3FF { background-position: -800px -800px; } .emoji-270F { background-position: -820px 0px; } .emoji-2712 { background-position: -820px -20px; } .emoji-2714 { background-position: -820px -40px; } .emoji-2716 { background-position: -820px -60px; } .emoji-271D { background-position: -820px -80px; } .emoji-2721 { background-position: -820px -100px; } .emoji-2728 { background-position: -820px -120px; } .emoji-2733 { background-position: -820px -140px; } .emoji-2734 { background-position: -820px -160px; } .emoji-2744 { background-position: -820px -180px; } .emoji-2747 { background-position: -820px -200px; } .emoji-274C { background-position: -820px -220px; } .emoji-274E { background-position: -820px -240px; } .emoji-2753 { background-position: -820px -260px; } .emoji-2754 { background-position: -820px -280px; } .emoji-2755 { background-position: -820px -300px; } .emoji-2757 { background-position: -820px -320px; } .emoji-2763 { background-position: -820px -340px; } .emoji-2764 { background-position: -820px -360px; } .emoji-2795 { background-position: -820px -380px; } .emoji-2796 { background-position: -820px -400px; } .emoji-2797 { background-position: -820px -420px; } .emoji-27A1 { background-position: -820px -440px; } .emoji-27B0 { background-position: -820px -460px; } .emoji-27BF { background-position: -820px -480px; } .emoji-2934 { background-position: -820px -500px; } .emoji-2935 { background-position: -820px -520px; } .emoji-2B05 { background-position: -820px -540px; } .emoji-2B06 { background-position: -820px -560px; } .emoji-2B07 { background-position: -820px -580px; } .emoji-2B1B { background-position: -820px -600px; } .emoji-2B1C { background-position: -820px -620px; } .emoji-2B50 { background-position: -820px -640px; } .emoji-2B55 { background-position: -820px -660px; } .emoji-3030 { background-position: -820px -680px; } .emoji-303D { background-position: -820px -700px; } .emoji-3297 { background-position: -820px -720px; } .emoji-3299 { background-position: -820px -740px; } .emoji-icon { background-image: image-url('emoji.png'); background-repeat: no-repeat; height: 20px; width: 20px; @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { background-image: image-url('emoji@2x.png'); background-size: 840px 820px; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/wiki.scss0000644000175600017570000000015612672631600030210 0ustar pravipravi.title .edit-wiki-header { width: 780px; margin-left: auto; margin-right: auto; padding-right: 7px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/issuable.scss0000644000175600017570000000733012672631600031055 0ustar pravipravi@media (max-width: $screen-sm-max) { .issuable-affix { margin-top: 20px; } } @media (max-width: $screen-md-max) { .issuable-affix { position: static; } } @media (min-width: $screen-md-max) { .issuable-affix { &.affix-top { position: static; } &.affix { position: fixed; top: 70px; margin-right: 35px; &.no-affix { position: relative; top: 0; } } } } .issuable-details { section { .issuable-discussion { margin-right: 1px; } } } .issuable-filter-count { span { display: block; margin-bottom: -16px; padding: 13px 0; } } .issuable-show-labels { a { margin-right: 5px; margin-bottom: 5px; display: inline-block; .color-label { padding: 6px 10px; } } } .issuable-sidebar { .block { @include clearfix; padding: $gl-padding 0; border-bottom: 1px solid $border-gray-light; // This prevents the mess when resizing the sidebar // of elements repositioning themselves.. width: $gutter_inner_width; // -- &:first-child { padding-top: 5px; } &:last-child { border: none; } span { margin-top: 7px; display: inline-block; } .select2-container span { margin-top: 0; } .issuable-count { } .gutter-toggle { margin-left: 20px; padding-left: 10px; &:hover { color: $gray-darkest; } } } .title { color: $gl-text-color; margin-bottom: 8px; .avatar { margin-left: 0; } label { font-weight: normal; margin-right: 4px; } .edit-link { color: $gl-gray; } } .cross-project-reference { color: $gl-link-color; span { white-space: nowrap; width: 85%; overflow: hidden; position: relative; display: inline-block; text-overflow: ellipsis; } cite { font-style: normal; } button { float: right; padding: 3px 5px; } } .selectbox { display: none } .btn-clipboard { color: $gl-gray; } .participants .avatar { margin-top: 6px; margin-right: 2px; } } .right-sidebar { position: fixed; top: 58px; bottom: 0; right: 0; transition: width .3s; background: $gray-light; padding: 10px 20px; &.right-sidebar-expanded { width: $gutter_width; hr { display: none; } .sidebar-collapsed-icon { display: none; } .gutter-toggle { border-left: 1px solid $border-gray-light; } } .subscribe-button { span { margin-top: 0; } } &.right-sidebar-collapsed { width: $sidebar_collapsed_width; padding-top: 0; hr { margin: 0; color: $gray-normal; border-color: $gray-normal; width: 62px; margin-left: -20px } .block { width: $sidebar_collapsed_width - 1px; margin-left: -19px; padding: 15px 0 0 0; border-bottom: none; overflow: hidden; } .hide-collapsed { display: none; } .gutter-toggle { margin-left: -36px; } .sidebar-collapsed-icon { display: block; width: 100%; text-align: center; padding-bottom: 10px; color: #999999; span { display: block; margin-top: 0; } .btn-clipboard { border: none; &:hover { background: transparent; } i { color: #999999; } } } } .btn { background: $gray-normal; border: 1px solid $border-gray-normal; &:hover { background: $gray-dark; border: 1px solid $border-gray-dark; } } } .detail-page-description { small { color: $gray-darkest; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/pages/commit.scss0000644000175600017570000000327212672631600030537 0ustar pravipravi.commit-title{ display: block; } .commit-author, .commit-committer{ display: block; color: #999; font-weight: normal; font-style: italic; } .commit-author strong, .commit-committer strong{ font-weight: bold; font-style: normal; } .commit-description { background: none; border: none; margin: 0; padding: 0; margin-top: 10px; } .commit-info-row { margin-bottom: 10px; .avatar { @extend .avatar-inline; } .commit-committer-link, .commit-author-link { color: #444; font-weight: bold; } } .commit-box { border-top: 1px solid $border-color; .commit-title { margin: 0; font-size: 23px; color: #313236; } .commit-description { margin-top: 15px; } } .file-stats { ul { list-style: none; margin: 0; padding: 10px 0; li { padding: 3px 0px; line-height: 20px; } } .new-file { a { color: $gl-text-green; } } .renamed-file { a { color: $gl-text-orange; } } .deleted-file { a { color: $gl-text-red; } } .edit-file{ a { color: $gl-text-color; } } } /* * Commit message textarea for web editor and * custom merge request message */ .commit-message-container { background-color: $body-bg; position: relative; font-family: $monospace_font; $left: 12px; .max-width-marker { width: 72ch; color: rgba(0, 0, 0, 0.0); font-family: inherit; left: $left; height: 100%; border-right: 1px solid mix($input-border, white); position: absolute; z-index: 1; } > textarea { background-color: rgba(0, 0, 0, 0.0); font-family: inherit; padding-left: $left; position: relative; z-index: 2; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/0000755000175600017570000000000012672631600027244 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/layout.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/layout.sc0000644000175600017570000000057512672631600031117 0ustar pravipravihtml { overflow-y: scroll; &.touch .tooltip { display: none !important; } } body { &.navless { background-color: white !important; } } .container { padding-top: 0; z-index: 5; } .container .content { margin: 0 0; } .navless-container { margin-top: $header-height; padding-top: $gl-padding * 2; } .container-limited { max-width: $fixed-layout-width; } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/gitlab-theme.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/gitlab-th0000644000175600017570000000416112672631600031044 0ustar pravipravi/** * Styles the GitLab application with a specific color theme * * $color-light - * $color - * $color-darker - * $color-dark - */ @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { .page-with-sidebar { .header-logo { background-color: $color; border-color: $color; a { color: $color-light; h3 { color: $color-light; } } &:hover { background-color: $color-darker; a { color: #FFF; } } } .collapse-nav a { color: #FFF; background: $color; } .sidebar-wrapper { background: $color-darker; .sidebar-user { background: $color-darker; color: $color-light; &:hover { background-color: $color-dark; color: #FFF; text-decoration: none; } } } .nav-sidebar li { a { color: $color-light; &:hover, &:focus, &:active { background: $color-dark; } i { color: $color-light; } .count { color: $color-light; background: $color-dark; } } &.separate-item { border-top: 1px solid $color; } &.active a { color: #FFF; background: $color-dark; &.no-highlight { border: none; } i { color: #FFF } } } } } $theme-blue: #2980B9; $theme-charcoal: #333c47; $theme-graphite: #888888; $theme-gray: #373737; $theme-green: #019875; $theme-violet: #554488; body { &.ui_blue { @include gitlab-theme(#BECDE9, $theme-blue, #1970A9, #096099); } &.ui_charcoal { @include gitlab-theme(#c5d0de, $theme-charcoal, #2b333d, #24272D); } &.ui_graphite { @include gitlab-theme(#CCCCCC, $theme-graphite, #777777, #666666); } &.ui_gray { @include gitlab-theme(#979797, $theme-gray, #272727, #222222); } &.ui_green { @include gitlab-theme(#AADDCC, $theme-green, #018865, #017855); } &.ui_violet { @include gitlab-theme(#9988CC, $theme-violet, #443366, #332255); } }././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/highlight.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/highlight0000644000175600017570000000177712672631600031152 0ustar pravipravi.file-content.code { border: none; box-shadow: none; margin: 0px; padding: 0px; table-layout: fixed; pre { padding: 10px; border: none; border-radius: 0; font-family: $monospace_font; font-size: $code_font_size !important; line-height: $code_line_height !important; margin: 0; overflow: auto; overflow-y: hidden; white-space: pre; word-wrap: normal; border-left: 1px solid; code { font-family: $monospace_font; white-space: pre; word-wrap: normal; padding: 0; .line { display: inline-block; } } } .line-numbers { padding: 10px; text-align: right; float: left; a { font-family: $monospace_font; display: block; font-size: $code_font_size !important; line-height: $code_line_height !important; white-space: nowrap; i { visibility: hidden; @extend .pull-left; } &:hover i { visibility: visible; } } } } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/pagination.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/paginatio0000644000175600017570000000027512672631600031146 0ustar pravipravi.gl-pagination { text-align: center; border-top: 1px solid $border-color; margin: 0; margin-top: 0; .pagination { padding: 0; } } .panel > .gl-pagination { margin: 0; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/header.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/header.sc0000644000175600017570000000616112672631600031027 0ustar pravipravi/* * Application Header * */ header { transition-duration: .3s; &.navbar-empty { height: 58px; background: #FFF; border-bottom: 1px solid #EEE; .center-logo { margin: 11px 0; text-align: center; #tanuki-logo, img { width: 36px; height: 36px; } } } &.navbar-gitlab { padding: 0 20px; z-index: 100; margin-bottom: 0; min-height: $header-height; background-color: #fff; border: none; border-bottom: 1px solid #EEE; .container-fluid { width: 100% !important; filter: none; padding: 0; .nav > li > a { color: #7f8fa4; font-size: 18px; padding: 0; margin: ($header-height - 28) / 2 0; margin-left: 10px; height: 28px; width: 28px; line-height: 28px; text-align: center; &:hover, &:focus, &:active { background-color: #FFF; } } .navbar-toggle { color: #666; margin: 6px 0; border-radius: 0; position: absolute; right: 2px; &:hover { background-color: #EEE; } &.active { color: #7f8fa4; } } } } .header-content { height: $header-height; .title { margin: 0; font-size: 19px; line-height: $header-height; font-weight: normal; color: #4c4e54; text-overflow: ellipsis; vertical-align: top; white-space: nowrap; a { color: #4c4e54; &:hover { text-decoration: underline; } } .dropdown-toggle-caret { position: relative; top: -2px; width: 12px; line-height: 12px; margin-left: 5px; font-size: 10px; text-align: center; cursor: pointer; } .project-item-select { right: auto; left: 0; } } .navbar-collapse { float: right; border-top: none; } } .search { margin-right: 10px; margin-left: 10px; margin-top: ($header-height - 36) / 2; form { margin: 0; padding: 0; } .search-input { width: 220px; &:focus { @include box-shadow(none); outline: none; } } } .impersonation i { color: $red-normal; } } @mixin collapsed-header { margin-left: $sidebar_collapsed_width; } @media (max-width: $screen-md-max) { .header-collapsed { margin-left: $sidebar_collapsed_width; } .header-expanded { margin-left: $sidebar_width; } } @media(min-width: $screen-md-max) { .header-collapsed { @include collapsed-header; } .header-expanded { margin-left: $sidebar_width; } } @media (max-width: $screen-xs-max) { header .container-fluid { font-size: 18px; .navbar-nav { margin: 0px; float: none !important; .visible-xs, .visable-sm { display: table-cell !important; } } .navbar-collapse { padding-left: 5px; li { display: table-cell; width: 1%; a { margin-left: 8px !important; } } } } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/mobile.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/mobile.sc0000644000175600017570000000373512672631600031052 0ustar pravipravi/** Common mobile (screen XS, SM) styles **/ @media (max-width: $screen-xs-max) { .container .content { margin-top: 20px; } .container-fluid { padding-left: 5px; padding-right: 5px; } .nav-links > li > a { padding: 10px; font-size: 12px; margin-right: 3px; .badge { display: none; } } .referenced-users { margin-right: 0; } .issues-details-filters, .dash-projects-filters, .check-all-holder { display: none; } .rss-btn { display: none !important; } .project-home-links { display: none; } .project-avatar { display: none; } .project-home-panel { padding-left: 0 !important; .project-avatar { display: block; } .project-home-desc { font-size: 21px; } .project-repo-buttons, .git-clone-holder { display: none; } } .project-stats { display: none; } .container .title { padding-left: 15px !important; } .issue-info, .merge-request-info { display: none; } .issue-details { .creator, .page-title .btn-close { display: none; } } %ul.notes .note-role, .note-actions { display: none; } .nav-links, .nav-links { li a { font-size: 14px; padding: 19px 10px; } } .activity-filter-block { display: none; } .projects-search-form { .btn { display: none; } } } @media (max-width: $screen-sm-max) { .issues-filters { .milestone-filter, .labels-filter { display: none; } } .page-title { .note_created_ago, .new-issue-link { display: none; } } .issue_edited_ago, .note_edited_ago { display: none; } aside:not(.right-sidebar){ display: none; } .show-aside { display: block !important; } } .show-aside { display: none; position: fixed; right: 0px; top: 30%; padding: 5px 15px; background: #EEE; font-size: 20px; color: #777; z-index: 100; @include box-shadow(0 1px 2px #DDD); } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/sidebar.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/sidebar.s0000644000175600017570000001134212672631600031042 0ustar pravipravi.page-with-sidebar { padding-top: $header-height; transition-duration: .3s; .sidebar-wrapper { position: fixed; top: 0; bottom: 0; overflow-y: auto; overflow-x: hidden; left: 0; height: 100%; transition-duration: .3s; } .gitlab-text-container-link { z-index: 1; position: absolute; left: 0px; } #logo { z-index: 2; position: absolute; width: 58px; cursor: pointer; } &.right-sidebar-expanded { padding-right: $gutter_width; } } .sidebar-wrapper { z-index: 99; background: $background-color; } .content-wrapper { width: 100%; .container-fluid { background: #FFF; padding: 0 $gl-padding; &.container-blank { background: none; padding: 0; border: none; } } } .sidebar-wrapper { .header-logo { border-bottom: 1px solid transparent; float: left; height: $header-height; width: $sidebar_width; position: fixed; z-index: 999; overflow: hidden; transition-duration: .3s; a { float: left; height: $header-height; width: 100%; padding: 11px 0 11px 22px; overflow: hidden; outline: none; transition-duration: .3s; img { width: 36px; height: 36px; } #tanuki-logo, img { float: left; } .gitlab-text-container { width: 230px; h3 { width: 158px; float: left; margin: 0; margin-left: 50px; font-size: 19px; line-height: 41px; font-weight: normal; } } } &:hover { background-color: #EEE; } } .sidebar-user { padding: 9px 22px; position: fixed; bottom: 40px; width: $sidebar_width; overflow: hidden; transition-duration: .3s; .username { margin-left: 10px; width: $sidebar_width - 2 * 10px; font-size: 16px; line-height: 34px; } } } .tanuki-shape { transition: all 0.8s; &:hover, &.highlight { fill: rgb(255, 255, 255); transition: all 0.1s; } } .nav-sidebar { margin-top: 14 + $header-height; margin-bottom: 100px; transition-duration: .3s; list-style: none; overflow: hidden; &.navbar-collapse { padding: 0px !important; } li { width: $sidebar_width; &.separate-item { padding-top: 10px; margin-top: 10px; } a { padding: 7px 15px; font-size: $gl-font-size; line-height: 24px; color: $gray; display: block; text-decoration: none; padding-left: 23px; font-weight: normal; outline: none; &:hover { text-decoration: none; } &:active, &:focus { text-decoration: none; } i { width: 16px; color: $gray-light; margin-right: 13px; } .count { float: right; background: #eee; padding: 0px 8px; @include border-radius(6px); } &.back-link i { transition-duration: .3s; } } } } .sidebar-subnav { margin-left: 0px; padding-left: 0px; li { list-style: none; } } @mixin expanded-sidebar { padding-left: $sidebar_width; &.right-sidebar-collapsed { padding-right: $sidebar_collapsed_width; } .sidebar-wrapper { width: $sidebar_width; .nav-sidebar { width: $sidebar_width; } .nav-sidebar li a{ width: 230px; &.back-link { i { opacity: 0; } } } } } @mixin collapsed-sidebar { padding-left: $sidebar_collapsed_width; &.right-sidebar-collapsed { padding-right: $sidebar_collapsed_width; } .sidebar-wrapper { width: $sidebar_collapsed_width; .header-logo { width: $sidebar_collapsed_width; a { padding-left: ($sidebar_collapsed_width - 36) / 2; .gitlab-text-container { display: none; } } } .nav-sidebar { width: $sidebar_collapsed_width; li { width: auto; a { span { display: none; } } } } .collapse-nav a { width: $sidebar_collapsed_width; } .sidebar-user { padding-left: ($sidebar_collapsed_width - 36) / 2; width: $sidebar_collapsed_width; .username { display: none; } } } } .collapse-nav a { width: $sidebar_width; position: fixed; bottom: 0; left: 0; font-size: 13px; background: transparent; height: 40px; text-align: center; line-height: 40px; transition-duration: .3s; outline: none; } .collapse-nav a:hover { text-decoration: none; background: #f2f6f7; } .page-sidebar-collapsed { @include collapsed-sidebar; } .page-sidebar-expanded { @include expanded-sidebar; } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tw_bootstrap.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tw_bootst0000644000175600017570000000634212672631600031220 0ustar pravipravi/* * Twitter bootstrap with GitLab customizations/additions * */ // Core variables and mixins @import "bootstrap/variables"; @import "bootstrap/mixins"; // Reset @import "bootstrap/normalize"; @import "bootstrap/print"; // Core CSS @import "bootstrap/scaffolding"; @import "bootstrap/type"; @import "bootstrap/code"; @import "bootstrap/grid"; @import "bootstrap/tables"; @import "bootstrap/forms"; @import "bootstrap/buttons"; // Components @import "bootstrap/component-animations"; @import "bootstrap/dropdowns"; @import "bootstrap/button-groups"; @import "bootstrap/input-groups"; @import "bootstrap/navs"; @import "bootstrap/navbar"; @import "bootstrap/breadcrumbs"; @import "bootstrap/pagination"; @import "bootstrap/pager"; @import "bootstrap/labels"; @import "bootstrap/badges"; @import "bootstrap/alerts"; @import "bootstrap/progress-bars"; @import "bootstrap/list-group"; @import "bootstrap/wells"; @import "bootstrap/close"; @import "bootstrap/panels"; // Components w/ JavaScript @import "bootstrap/modals"; @import "bootstrap/tooltip"; @import "bootstrap/popovers"; @import "bootstrap/carousel"; // Utility classes .clearfix { @include clearfix(); } .center-block { @include center-block(); } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { @include text-hide(); } .hidden { display: none !important; visibility: hidden !important; } .affix { position: fixed; } @import "bootstrap/responsive-utilities"; // Labels .label { padding: 2px 4px; font-size: 13px; font-style: normal; font-weight: normal; display: inline-block; &.label-gray { background-color: #f8fafc; color: $gl-gray; text-shadow: none; } &.label-inverse { background-color: #333333; } } /** * fix to keep tooltips position in top navigation bar * */ .navbar .nav > li { position: relative; white-space: nowrap; } /** * Add some extra stuff to panels * */ .panel { box-shadow: none; .panel-body { form, pre { margin: 0; } .form-actions { margin: -15px; margin-top: 18px; } } .panel-footer { .pagination { margin: 0; } .btn { min-width: 124px; } .btn-clipboard { min-width: 0px; } } &.panel-small { .panel-heading { padding: 6px 15px; font-size: 13px; font-weight: normal; a { color: #777; } } } } .panel-succes .panel-heading, .panel-info .panel-heading, .panel-danger .panel-heading, .panel-warning .panel-heading, .panel-primary .panel-heading, .alert { a:not(.btn) { @extend .alert-link; color: #fff; text-decoration: underline; } } .alert-help { background-color: $background-color; border: 1px solid $border-color; color: $gl-gray; } // Typography ================================================================= .text-primary, .text-primary:hover { color: $brand-primary; } .text-success, .text-success:hover { color: $brand-success; } .text-danger, .text-danger:hover { color: $brand-danger; } .text-warning, .text-warning:hover { color: $brand-warning; } .text-info, .text-info:hover { color: $brand-info; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/zen.scss0000644000175600017570000000177212672631600030744 0ustar pravipravi.zennable { a.js-zen-enter { color: $gl-gray; position: absolute; top: 0px; right: 4px; line-height: 56px; } a.js-zen-leave { display: none; color: $gl-text-color; position: absolute; top: 10px; right: 10px; padding: 5px; font-size: 36px; &:hover { color: #111; } } .zen-backdrop { &.fullscreen { background-color: white; position: fixed; top: 0; bottom: 0; left: 0; right: 0; z-index: 1031; textarea { border: none; box-shadow: none; border-radius: 0; color: #000; font-size: 20px; line-height: 26px; padding: 30px; display: block; outline: none; resize: none; height: 100vh; max-width: 900px; margin: 0 auto; } a.js-zen-enter { display: none; } a.js-zen-leave { display: block; position: absolute; top: 0; } } } } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/markdown_area.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/markdown_0000644000175600017570000000317212672631600031153 0ustar pravipravi.div-dropzone-wrapper { .div-dropzone { position: relative; padding: 0; border: 0; margin-bottom: 5px; .div-dropzone-focus { border-color: #66afe9 !important; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6) !important; outline: 0 !important; } .div-dropzone-hover { position: absolute; top: 50%; left: 50%; margin-top: -0.5em; margin-left: -0.6em; opacity: 0; font-size: 50px; transition: opacity 200ms ease-in-out; pointer-events: none; } .div-dropzone-spinner { position: absolute; top: 100%; left: 100%; margin-top: -1.1em; margin-left: -1.1em; opacity: 0; font-size: 30px; transition: opacity 200ms ease-in-out; } .div-dropzone-icon { display: block; text-align: center; font-size: inherit; } .div-dropzone-progress { position: absolute; top: 7px; left: -40px; width: 35px; font-size: 13px; text-align: right; } .dz-preview { display: none; } } } .div-dropzone-alert { margin-top: 5px; margin-bottom: 0; transition: opacity 200ms ease-in-out; } .md-area { position: relative; } .referenced-users { color: #4c4e54; padding-top: 10px; } .md-preview-holder { background: #FFF; border: 1px solid #ddd; min-height: 169px; padding: 5px; box-shadow: none; } .markdown-area { @include border-radius(0); background: #FFF; border: 1px solid #ddd; min-height: 140px; max-height: 500px; padding: 5px; box-shadow: none; width: 100%; } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/calendar.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/calendar.0000644000175600017570000000141212672631600031014 0ustar pravipravi.user-calendar-activities { .calendar_onclick_hr { padding: 0; margin: 10px 0; } .str-truncated { max-width: 70%; } .text-expander { background: #eee; color: #555; padding: 0 5px; cursor: pointer; margin-left: 4px; &:hover { background-color: #ddd; } } } /** * This overwrites the default values of the cal-heatmap gem */ .calendar { .qi { fill: #fff; } .q1 { fill: #ededed !important; } .q2 { fill: #ACD5F2 !important; } .q3 { fill: #7FA8D1 !important; } .q4 { fill: #49729B !important; } .q5 { fill: #254E77 !important; } .domain-background { fill: none; shape-rendering: crispedges; } .ch-tooltip { padding: 3px; font-weight: 550; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/jquery.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/jquery.sc0000644000175600017570000000205612672631600031115 0ustar pravipravi.ui-widget { font-family: $regular_font; font-size: $font-size-base; &.ui-datepicker-inline { border: 1px solid #DDD; padding: 10px; width: 270px; .ui-datepicker-header { background: #FFF; border-color: #DDD; } .ui-datepicker-calendar td a { padding: 5px; text-align: center; } } &.ui-autocomplete { border-color: #DDD; padding: 0; margin-top: 2px; z-index: 1001; .ui-menu-item a { padding: 4px 10px; } } .ui-state-default { border: 1px solid #FFF; background: #FFF; color: #777; } .ui-state-highlight { border: 1px solid #EEE; background: #EEE; } .ui-state-active { border: 1px solid $gl-primary; background: $gl-primary; color: #FFF; } .ui-state-hover, .ui-state-focus { border: 1px solid $row-hover; background: $row-hover; color: #333; } } .ui-sortable-handle { cursor: move; cursor: -webkit-grab; cursor: -moz-grab; &:active { cursor: -webkit-grabbing; cursor: -moz-grabbing; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/blocks.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/blocks.sc0000644000175600017570000000432612672631600031055 0ustar pravipravi.light-well { background-color: #f8fafc; padding: 15px; } .centered-light-block { text-align: center; color: $gl-gray; margin: 20px; } .nothing-here-block { text-align: center; padding: 20px; color: $gl-gray; font-weight: normal; font-size: 16px; line-height: 36px; } .gray-content-block { margin-top: 0; margin-bottom: -$gl-padding; background-color: $background-color; padding: $gl-padding; margin-bottom: 0px; border-top: 1px solid $border-color; border-bottom: 1px solid $border-color; color: $gl-gray; &.oneline-block { line-height: 42px; } &.white { background-color: white; } &.top-block { border-top: none; } &.middle-block { margin-top: 0; margin-bottom: 0; } &.clear-block { margin-bottom: $gl-padding - 1px; padding-bottom: $gl-padding; } &.second-block { margin-top: -1px; margin-bottom: 0; } &.footer-block { margin-top: 0; border-bottom: none; margin-bottom: -$gl-padding; } .title { color: $gl-text-color; } .oneline { line-height: 42px; } > p:last-child { margin-bottom: 0; } .block-controls { float: right; .control { float: left; margin-left: 10px; } } } .cover-block { text-align: center; background: $background-color; padding-top: 44px; position: relative; .avatar-holder { margin-bottom: 16px; .avatar, .identicon { margin: 0 auto; float: none; } .identicon { @include border-radius(50%); } } .cover-title { color: $gl-header-color; margin: 0; font-size: 23px; font-weight: normal; margin: 16px 0 5px 0; color: #4c4e54; font-size: 23px; line-height: 1.1; } .cover-desc { padding: 0 $gl-padding 3px; color: $gl-text-color; } .cover-controls { position: absolute; top: 10px; right: 10px; &.left { left: 10px; right: auto; } } } .block-connector { margin-top: -1px; } .nav-block { .controls { float: right; margin-top: 11px; } } .content-block { padding: $gl-padding 0; border-bottom: 1px solid $border-color; &.oneline-block { line-height: 36px; } > .controls { float: right; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/panels.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/panels.sc0000644000175600017570000000051312672631600031054 0ustar pravipravi.panel { margin-bottom: $gl-padding; .panel-heading { padding: $gl-vert-padding $gl-padding; line-height: 36px; .controls { margin-top: -2px; float: right; } } .panel-body { padding: $gl-padding; .form-actions { margin: -$gl-padding; margin-top: $gl-padding; } } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/nav.scss0000644000175600017570000000521512672631600030730 0ustar pravipravi.nav-links { padding: 0; margin: 0; list-style: none; height: auto; border-bottom: 1px solid $border-color; li { display: inline-block; a { display: inline-block; padding: 14px; padding-top: $gl-padding; padding-bottom: 11px; margin-bottom: -1px; font-size: 15px; line-height: 28px; color: #959494; border-bottom: 2px solid transparent; &:hover, &:active, &:focus { text-decoration: none; outline: none; } } &.active a { color: #000000; border-bottom: 2px solid #4688f1; } .badge { font-weight: normal; background-color: #eee; color: #78a; } } } .top-area { @include clearfix; border-bottom: 1px solid #EEE; .nav-text { padding-top: 16px; padding-bottom: 11px; display: inline-block; width: 50%; line-height: 28px; /* Small devices (phones, tablets, 768px and lower) */ @media (max-width: $screen-sm-min) { width: 100%; } } .nav-links { display: inline-block; width: 50%; margin-bottom: 0px; border-bottom: none; /* Small devices (phones, tablets, 768px and lower) */ @media (max-width: $screen-sm-min) { width: 100%; } } .nav-controls { width: 50%; display: inline-block; float: right; text-align: right; padding: 11px 0; margin-bottom: 0px; > .dropdown { margin-right: $gl-padding-top; display: inline-block; } > .btn { margin-right: $gl-padding-top; display: inline-block; &:last-child { margin-right: 0; } } > .btn-grouped { float: none; } > form { display: inline-block; } input { height: 34px; display: inline-block; position: relative; top: 1px; margin-right: $gl-padding-top; /* Medium devices (desktops, 992px and up) */ @media (min-width: $screen-md-min) { width: 200px; } /* Large devices (large desktops, 1200px and up) */ @media (min-width: $screen-lg-min) { width: 250px; } &.input-short { /* Medium devices (desktops, 992px and up) */ @media (min-width: $screen-md-min) { width: 170px; } /* Large devices (large desktops, 1200px and up) */ @media (min-width: $screen-lg-min) { width: 210px; } } } /* Hide on extra small devices (phones) */ @media (max-width: $screen-xs-max) { display: none; } /* Small devices (tablets, 768px and lower) */ @media (max-width: $screen-sm-max) { width: 100%; text-align: left; input { width: 300px; } } } } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/issue_box.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/issue_box0000644000175600017570000000114112672631600031164 0ustar pravipravi/** * Issue box for showing Open/Closed state: * Used for Issue#show page, MergeRequest#show page etc * */ .status-box { @include border-radius(3px); display: block; float: left; padding: 0 $gl-btn-padding; font-weight: normal; margin-right: 10px; font-size: $gl-font-size; &.status-box-closed { background-color: $gl-danger; color: #FFF; } &.status-box-merged { background-color: $gl-primary; color: #FFF; } &.status-box-open { background-color: $green-light; color: #FFF; } &.status-box-expired { background: #cea61b; color: #FFF; } } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/gfm.scss0000644000175600017570000000056712672631600030722 0ustar pravipravi/** * Styles that apply to all GFM related forms. */ .issue-form, .merge-request-form, .wiki-form { .description { height: 16em; border-top-left-radius: 0; } } .wiki-form { .description { height: 26em; } } .milestone-form { .description { height: 14em; } } .gfm-commit, .gfm-commit_range { font-family: $monospace_font; font-size: 90%; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/files.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/files.scs0000644000175600017570000000563512672631600031071 0ustar pravipravi/** * File content holder * */ .file-holder { border: none; border: 1px solid $border-color; &.readme-holder { margin-top: 10px; border-bottom: 0; } table { @extend .table; } .file-title { position: relative; background: $background-color; border-bottom: 1px solid $border-color; margin: 0; text-align: left; padding: 10px $gl-padding; .file-actions { float: right; position: absolute; top: 5px; right: 15px; .btn { padding: 0px 10px; font-size: 13px; line-height: 28px; } } .filename { &.old { span.idiff { background-color: #f8cbcb; } } &.new { span.idiff { background-color: #a6f3a6; } } } .left-options { margin-top: -3px; } } .file-content { background: #fff; &.image_file { background: #eee; text-align: center; img { padding: 100px; max-width: 50%; } } &.wiki { padding: $gl-padding; .highlight { margin-bottom: 9px; > pre { margin: 0; } } } &.blob_file { } &.blob-no-preview { background: #eee; text-shadow: 0 1px 2px #FFF; padding: 100px 0; } /** * Blame file */ &.blame { table { border: none; box-shadow: none; margin: 0; } tr { border-bottom: 1px solid #eee; } td { &:first-child { border-left: none; } &:last-child { border-right: none; } } img.avatar { border: 0 none; float: none; margin: 0; padding: 0; } td.blame-commit { background: #f9f9f9; min-width: 350px; .commit-author-link { color: #888; } } td.line-numbers { float: none; border-left: 1px solid #DDD; } td.lines { padding: 0; code { font-family: $monospace_font; } pre { margin: 0; } } } &.logs { background: #eee; max-height: 700px; overflow-y: auto; ol { margin-left: 40px; padding: 10px 0; border-left: 1px solid $border-color; margin-bottom: 0; background: white; li { color: #888; p { margin: 0; color: #333; line-height: 24px; padding-left: 10px; } &:hover { background: $row-hover; } } } } /** * Code file */ &.code { padding: 0; } } } span.idiff { &.left { border-top-left-radius: 2px; border-bottom-left-radius: 2px; } &.right { border-top-right-radius: 2px; border-bottom-right-radius: 2px; } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/filters.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/filters.s0000644000175600017570000000077312672631600031107 0ustar pravipravi.filter-item { margin-right: 6px; } @media (min-width: 800px) { .issues-filters, .issues_bulk_update { select, .select2-container { width: 120px !important; display: inline-block; } } } @media (min-width: 1200px) { .issues-filters, .issues_bulk_update { select, .select2-container { width: 150px !important; display: inline-block; } } } .issues-filters, .issues_bulk_update { .select2-container .select2-choice { color: #444 !important; } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/selects.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/selects.s0000644000175600017570000000604012672631600031072 0ustar pravipravi/** Select2 selectbox style override **/ .select2-container, .select2-container.select2-drop-above { .select2-choice { background: #FFF; border-color: #DDD; height: 36px; padding: 6px $gl-padding; font-size: $gl-font-size; line-height: 1.42857143; @include border-radius(2px); .select2-arrow { background: #FFF; border-left: none; padding-top: 5px; } .select2-chosen { color: $gl-text-color; } &.select2-default { .select2-chosen { color: #999; } } } } .select2-container .select2-choice, .select2-container.select2-drop-above .select2-choice{ color: #7f8fa4; border: 1px solid #e7e9ed; } .select2-drop { @include box-shadow(rgba(76, 86, 103, 0.247059) 0px 0px 1px 0px, rgba(31, 37, 50, 0.317647) 0px 2px 18px 0px); @include border-radius (0px); padding: 16px; border: none !important; } .select2-results .select2-result-label { padding: 9px; } .select2-drop{ color: #7f8fa4; } .select2-highlighted { background: #3084bb !important; } .select2-results li.select2-result-with-children > .select2-result-label { font-weight: 600; color: #313236; } .select2-container-multi { .select2-choices { @include border-radius(2px); border-color: $input-border; background: white; padding-left: $gl-padding / 2; .select2-search-field input { padding: $gl-padding / 2; font-size: 13px; height: auto; font-family: inherit; font-size: inherit; } .select2-search-choice { margin: 8px 0 0 8px; background: white; box-shadow: none; border-color: $input-border; color: $gl-text-color; line-height: 15px; .select2-search-choice-close { top: 5px; } &.select2-search-choice-focus { border-color: $gl-text-color; } } } } .select2-drop-active { border: 1px solid #BBB !important; margin-top: 4px; font-size: 13px; &.select2-drop-above { margin-bottom: 8px; } .select2-search input { background: #fafafa; border-color: #DDD; } .select2-results { max-height: 350px; .select2-highlighted { background: $gl-primary; } } } .select2-container { width: 100% !important; } /** Branch/tag selector **/ .project-refs-form .select2-container { width: 160px !important; } .ajax-users-dropdown, .ajax-project-users-dropdown { .select2-search { padding-top: 2px; } } .ajax-users-select { width: 400px; &.input-large { width: 210px; } &.input-clamp { max-width: 100%; } } .group-result { .group-image { float: left; } .group-name { font-weight: bold; } .group-path { color: #999; } } .user-result { min-height: 24px; .user-image { float: left; } &.no-username { .user-name { line-height: 24px; } } } .namespace-result { .namespace-kind { color: #AAA; font-weight: normal; } .namespace-path { margin-left: 10px; font-weight: bolder; } } .ajax-users-dropdown { min-width: 250px !important; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tables.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tables.sc0000644000175600017570000000132512672631600031046 0ustar pravipravi.table-holder { margin: 0; } table { &.table { margin-bottom: $gl-padding; .dropdown-menu a { text-decoration: none; } .success, .warning, .danger, .info { color: #fff; a:not(.btn) { text-decoration: underline; color: #fff; } } tr { td, th { padding: 10px $gl-padding; line-height: 20px; vertical-align: middle; } th { background-color: $background-color; font-weight: normal; font-size: 15px; border-bottom: 1px solid $border-color; } td { border-color: $table-border-color; border-bottom: 1px solid $border-color; } } } } ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tw_bootstrap_variables.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/tw_bootst0000644000175600017570000000776612672631600031233 0ustar pravipravi// Override Bootstrap variables here (defaults from bootstrap-sass v3.3.3): // For all variables see https://github.com/twbs/bootstrap-sass/blob/master/templates/project/_bootstrap-variables.sass // // Variables // -------------------------------------------------- //== Colors // //## Gray and brand colors for use across Bootstrap. // $gray-base: #000 // $gray-darker: lighten($gray-base, 13.5%) // #222 // $gray-dark: lighten($gray-base, 20%) // #333 // $gray: lighten($gray-base, 33.5%) // #555 // $gray-light: lighten($gray-base, 46.7%) // #777 // $gray-lighter: lighten($gray-base, 93.5%) // #eee $brand-primary: $gl-primary; $brand-success: $gl-success; $brand-info: $gl-info; $brand-warning: $gl-warning; $brand-danger: $gl-danger; $border-radius-base: 3px !default; $border-radius-large: 3px !default; $border-radius-small: 3px !default; //== Scaffolding // $text-color: $gl-text-color; $link-color: $gl-link-color; //== Typography // //## Font, line-height, and color for body text, headings, and more. $font-family-sans-serif: $regular_font; $font-family-monospace: $monospace_font; $font-size-base: $gl-font-size; //== Components // //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). $padding-base-vertical: $gl-vert-padding; $padding-base-horizontal: $gl-padding; $component-active-color: #fff; $component-active-bg: $brand-info; //== Forms // //## $input-color: $text-color; $input-border: #e7e9ed; $input-border-focus: #7F8FA4; $legend-color: $text-color; //== Pagination // //## $pagination-color: $gl-gray; $pagination-bg: #fff; $pagination-border: $border-color; $pagination-hover-color: $gl-gray; $pagination-hover-bg: $row-hover; $pagination-hover-border: $border-color; $pagination-active-color: $blue-dark; $pagination-active-bg: #fff; $pagination-active-border: $border-color; $pagination-disabled-color: #cdcdcd; $pagination-disabled-bg: $background-color; $pagination-disabled-border: $border-color; //== Form states and alerts // //## Define colors for form feedback states and, by default, alerts. $state-success-text: #fff; $state-success-bg: $brand-success; $state-success-border: $brand-success; $state-info-text: #fff; $state-info-bg: $brand-info; $state-info-border: $brand-info; $state-warning-text: #fff; $state-warning-bg: $brand-warning; $state-warning-border: $brand-warning; $state-danger-text: #fff; $state-danger-bg: $brand-danger; $state-danger-border: $brand-danger; //== Alerts // //## Define alert colors, border radius, and padding. $alert-border-radius: 0; //== Panels // //## $panel-border-radius: 2px; $panel-default-text: $text-color; $panel-default-border: $border-color; $panel-default-heading-bg: $background-color; $panel-footer-bg: $background-color; $panel-inner-border: $border-color; //== Wells // //## $well-bg: #F9F9F9; $well-border: #EEE; //== Code // //## $code-color: #c7254e; $code-bg: #f9f2f4; $kbd-color: #fff; $kbd-bg: #333; //== Buttons // //## $btn-default-color: $gl-text-color; $btn-default-bg: #fff; $btn-default-border: #e7e9ed; //== Nav // //## $nav-link-padding: 13px $gl-padding; //== Code // //## $pre-bg: #f8fafc !default; $pre-color: $gl-gray !default; $pre-border-color: #e7e9ed; $table-bg-accent: $background-color; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/forms.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/forms.scs0000644000175600017570000001035512672631600031110 0ustar pravipravitextarea { resize: vertical; } input { border-radius: $border-radius-base; } input[type='search'] { background-color: white; padding-left: 10px; } input[type='search'].search-input { background-repeat: no-repeat; background-position: 10px; background-size: 16px; background-position-x: 30%; padding-left: 10px; background-color: $gray-light; &.search-input[value=""] { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAFu0lEQVRIia1WTahkVxH+quqce7vf6zdvJpHoIlkYJ2SiJiIokmQjgoGgIAaEIYuYXWICgojiwkmC4taFwhjcyIDusogEIwwiSSCKPwsdwzAg0SjJ9Izzk5n3+nXfe8+pqizOvd395scfsJqi6dPnnDr11Vc/NJ1OwUTosqJLCmYCHCAC2mSHs+ojZv6AO46Y+20AhIneJsafhPhXVZSXDk7qi+aOLhtQNuBmQtcarAKjTXpn2+l3u2yPunvZSABRucjcAV/eMZuM48/Go/g1d19kc4wq+e8MZjWkbI/P5t2P3RFFbv7SQdyBlBUx8N8OTuqjMcof+N94yMPrY2DMm/ytnb32J0QrY+6AqsHM4Q64O9SKDmerKDD3Oy/tNL9vk342CC8RuU6n0ymCMHb22scu7zQngtASOjUHE1BX4UUAv4b7Ow6qiXCXuz/UdvogAAweDY943/b4cAz0ZlYHXeMsnT07RVb7wMUr8ykI4H5HVkMd5Rcb4/jNURVOL5qErAaAUUdCCIJ5kx5q2nw8m39ImEAAsjpE6PStB0YfMcd1wqqG3Xn7A3PfZyyKnNjaqD4fmE/fCNKshirIyY1xvI+Av6g5QIAIIWX7cJPssboSiBBEeKmsZne0Sb8kzAUWNYyq8NvbDo0fZ6beqxuLmqOOMr/lwOh+YXpXtbjERGja9JyZ9+HxpXKb9Gj5oywRESbj+Cj1ENG1QViTGBl1FbC1We1tbVRfHWIoQkhqH9xbpE92XUbb6VJZ1R4crjRz1JWcDMJvLdoMcyAEhjuwHo8Bfndg3mbszhOY+adVlMtD3po51OwzIQiEaams7oeJhxRw1FFOVpFRRUYIhMBAFRnjOsC8IFHHUA4TQQhgAqpAiIFfGbxkIqj54ayGbL7UoOqHCniAEKHLNr26l+D9wQJzeUwMAnfHvEnLECzZRwRV++d60ptjW9VLZeolEJG6GwCCE0CFVNB+Ay0NEqoQYG4YYFu7B8IEVRt3uRzy/osIoLV9QZimWXGHUMFdmI6M64DUF2Je88R9VZqCSP+QlcF5k+4tCzSsXaqjINuK6UyE0+s/mk6/qFq8oAIL9pqMLhkGsNrOyoOIlszust3aJv0U9+kFdwjTGwWl1YdF+KWlQSZ0Se/psj8yGVdg5tJyfH96EBWmLtoEMwMzMFt031NzGWLLzKhC+KV7H5ZeeaMOPxemma2x68puc0LN3+/u6LJiePS6MKHvn4wu6cPzJj0hsioeMfDrEvjv5r6W9gBvjKJujuKzQ0URIZj75NylvT+mbHfXQa4rwAMaVRTMm/SFyzvNy0yF6+4AM+1ubcSnqkAIUjQKl1RKSbE5jt+vovx1MBqF0WW7/d1Z80ab9BtmuJ3Xk5cJKds9TZt/uLPXvtiTrQ+dIwqfAejUvM1os6FNikXKUHfQ+ekUsXT5u85enJ0CaBSkkGEo1syUQ+DfMdE/4GA1uzupf9zdbzhOmLsF4efHVXjaHHAzmDtGdQRd/Nc5wAEJjNki3XfhyvwVNz80xANrht3LsENY9cBBdN1L9GUyyvFRFZ42t75sBvCQRykbRlU4tT2pPxoCvzx09d4GmPs200M6wKdWSDGK8mppYSWdhAlt0qeaLv+IadXU9/Evq4FAZ8ej+LmtcTxaRX4NWI0Uag5Vg1p5MYg8BnlhXIdPHDow+vTWZvVMVttXDLqkTzZdPj6Qii6cP1cSvIdl3iQkNYyi9HH0I22y+93tY3DcQkTZgQtM+POoCr8x97eylkmtrgKuztrvXJ21x/aNKuqIkZ/fntRfCdcTfhUTAIhRzoDojJD0aSNLLwMzmpT7+JaLtyf1MwDo6qz9djFaUq3t9MlFmy/c1OCSceY9fMsVaL9mvH9ocXdkdWxv1scAePG0THAhMOaLdOw/Gvxfxb1w4eCapyIENUcV5M3/u8FitAxZ25P6GAHT3UX39Srw+QOb1ZffA98Dl2Wy1BYkAAAAAElFTkSuQmCC'); } &.search-input::-webkit-input-placeholder { text-align: center; } &.search-input:-moz-placeholder { /* Firefox 18- */ text-align: center; } &.search-input::-moz-placeholder { /* Firefox 19+ */ text-align: center; } &.search-input:-ms-input-placeholder { text-align: center; } } input[type='text'].danger { background: #F2DEDE!important; border-color: #D66; text-shadow: 0 1px 1px #fff } .datetime-controls { select { width: 100px; } } .form-actions { margin: -$gl-padding; margin-top: 0; margin-bottom: -$gl-padding; padding: $gl-padding; background-color: $background-color; border-top: 1px solid $border-color; } label { &.control-label { @extend .col-sm-2; } &.inline-label { margin: 0; } } .inline-input-group { width: 250px; } .custom-form-control { width: 150px; } @media (min-width: $screen-sm-min) { .custom-form-control { width: 150px; } } /* Medium devices (desktops, 992px and up) */ @media (min-width: $screen-md-min) { .custom-form-control { width: 170px; } } /* Large devices (large desktops, 1200px and up) */ @media (min-width: $screen-lg-min) { .custom-form-control { width: 200px; } } .fieldset-form fieldset { margin-bottom: 20px; } .form-control { @include box-shadow(none); border-radius: 3px; } .form-control-inline { display: inline; } .wiki-content { margin-top: 35px; } .form-group .control-label { font-weight: normal; } .form-control::-webkit-input-placeholder { color: #7f8fa4; } .input-group { .select2-container { display: table-cell; width: 200px !important; } .input-group-addon { background-color: #f7f8fa; } .input-group-addon:not(:first-child):not(:last-child) { border-left: 0; border-right: 0; } } .help-block { margin-bottom: 0; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/fonts.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/fonts.scs0000644000175600017570000000225012672631600031106 0ustar pravipravi/* latin-ext */ @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 300; src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf.woff2') format('woff2'), font-url('SourceSansPro-Light.ttf.woff') format('woff'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf.woff2') format('woff2'), font-url('SourceSansPro-Regular.ttf.woff') format('woff'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 600; src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf.woff2') format('woff2'), font-url('SourceSansPro-Semibold.ttf.woff') format('woff'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf.woff2') format('woff2'), font-url('SourceSansPro-Bold.ttf.woff') format('woff'); } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/timeline.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/timeline.0000644000175600017570000000205312672631600031053 0ustar pravipravi.timeline { @include basic-list; margin: 0; padding: 0; .timeline-entry { padding: $gl-padding $gl-btn-padding; border-color: $table-border-color; color: $gl-gray; border-bottom: 1px solid $border-white-light; &:target { background: $row-hover; } &:last-child { border-bottom: none; } .avatar { margin-right: 15px; } .controls { padding-top: 10px; float: right; } } .note-text { p:last-child { margin-bottom: 0; } } .system-note { .note-text { color: $gl-gray !important; } } .diff-file { border: 1px solid $border-color; border-bottom: none; margin-left: 0; margin-right: 0; } } @media (max-width: $screen-xs-max) { .timeline { &:before { background: none; } .timeline-entry .timeline-entry-inner { .timeline-icon { display: none; } .timeline-content { margin-left: 0; } } } } .discussion .timeline-entry { margin: 0; border-right: none; } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/callout.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/callout.s0000644000175600017570000000153412672631600031076 0ustar pravipravi/* * Callouts from Bootstrap3 docs * * Not quite alerts, but custom and helpful notes for folks reading the docs. * Requires a base and modifier class. */ /* Common styles for all types */ .bs-callout { margin: $gl-padding 0; padding: $gl-padding; border-left: 3px solid $border-color; color: $text-color; background: $background-color; } .bs-callout h4 { margin-top: 0; margin-bottom: 5px; } .bs-callout p:last-child { margin-bottom: 0; } /* Variations */ .bs-callout-danger { background-color: #fdf7f7; border-color: #eed3d7; color: #b94a48; } .bs-callout-warning { background-color: #faf8f0; border-color: #faebcc; color: #8a6d3b; } .bs-callout-info { background-color: #f4f8fa; border-color: #bce8f1; color: #34789a; } .bs-callout-success { background-color: #dff0d8; border-color: #5cA64d; color: #3c763d; } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/buttons.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/buttons.s0000644000175600017570000000657012672631600031136 0ustar pravipravi@mixin btn-default { @include border-radius(3px); font-size: $gl-font-size; font-weight: 500; padding: $gl-vert-padding $gl-btn-padding; &:focus, &:active { outline: none; @include box-shadow(inset 0 0 4px rgba(0, 0, 0, 0.12)); } } @mixin btn-middle { @include btn-default; } @mixin btn-color($light, $border-light, $normal, $border-normal, $dark, $border-dark, $color) { background-color: $light; border-color: $border-light; color: $color; &:hover, &:focus { background-color: $normal; border-color: $border-normal; color: $color; } &:active { @include box-shadow (inset 0 0 4px rgba(0, 0, 0, 0.12)); background-color: $dark; border-color: $border-dark; color: $color; } } @mixin btn-green { @include btn-color($green-light, $border-green-light, $green-normal, $border-green-normal, $green-dark, $border-green-dark, #FFFFFF); } @mixin btn-blue { @include btn-color($blue-light, $border-blue-light, $blue-normal, $border-blue-normal, $blue-dark, $border-blue-dark, #FFFFFF); } @mixin btn-blue-medium { @include btn-color($blue-medium-light, $border-blue-light, $blue-medium, $border-blue-normal, $blue-medium-dark, $border-blue-dark, #FFFFFF); } @mixin btn-orange { @include btn-color($orange-light, $border-orange-light, $orange-normal, $border-orange-normal, $orange-dark, $border-orange-dark, #FFFFFF); } @mixin btn-red { @include btn-color($red-light, $border-red-light, $red-normal, $border-red-normal, $red-dark, $border-red-dark, #FFFFFF); } @mixin btn-gray { @include btn-color($gray-light, $border-gray-light, $gray-normal, $border-gray-light, $gray-dark, $border-gray-dark, #313236); } @mixin btn-white { @include btn-color($white-light, $border-white-light, $white-normal, $border-white-normal, $white-dark, $border-white-dark, #313236); } .btn { @include btn-default; @include btn-white; &.btn-small, &.btn-sm { padding: 4px 10px; font-size: 13px; line-height: 18px; } &.btn-xs { padding: 2px 5px; } &.btn-success, &.btn-new, &.btn-create, &.btn-save { @include btn-green; } &.btn-gray { @include btn-gray; } &.btn-primary { @include btn-blue-medium; } &.btn-info { @include btn-blue; } &.btn-close, &.btn-warning { @include btn-orange; } &.btn-danger, &.btn-remove, &.btn-red { @include btn-red; } &.btn-cancel { float: right; } &.btn-reopen { /* should be same as parent class for now */ } &.btn-grouped { margin-right: 7px; float: left; &:last-child { margin-right: 0px; } &.btn-xs { margin-right: 3px; } } &.disabled { pointer-events: auto !important; } } .btn-block { width: 100%; margin: 0; margin-bottom: 15px; &.btn { padding: 6px 0; } } .btn-group { &.btn-grouped { margin-right: 7px; float: left; &:last-child { margin-right: 0px; } } } .btn-clipboard { border: none; padding: 0 5px; } .input-group-btn { .btn { @include btn-middle; &:hover { outline: none; } &:focus { outline: none; } &:active { outline: none; } &.btn-clipboard { padding-left: 15px; padding-right: 15px; } } .active { @include box-shadow(inset 0 0 4px rgba(0, 0, 0, 0.12)); border: 1px solid #c6cacf !important; background-color: #e4e7ed !important; } } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/variables.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/variables0000644000175600017570000000461412672631600031144 0ustar pravipravi$row-hover: #f4f8fe; $gl-text-color: #54565B; $gl-text-green: #4A2; $gl-text-red: #D12F19; $gl-text-orange: #D90; $gl-header-color: #323232; $gl-link-color: #333c48; $md-text-color: #444; $md-link-color: #3084bb; $nprogress-color: #c0392b; $gl-font-size: 15px; $list-font-size: 15px; $sidebar_collapsed_width: 62px; $sidebar_width: 230px; $gutter_collapsed_width: 62px; $gutter_width: 290px; $gutter_inner_width: 258px; $avatar_radius: 50%; $code_font_size: 13px; $code_line_height: 1.5; $border-color: #efeff1; $table-border-color: #eef0f2; $background-color: #faf9f9; $header-height: 58px; $fixed-layout-width: 1280px; $gl-gray: #5a5a5a; $gl-padding: 16px; $gl-btn-padding: 10px; $gl-vert-padding: 6px; $gl-padding-top:10px; $gl-avatar-size: 40px; $secondary-text: #7f8fa4; $error-exclamation-point: #E62958; /* * Color schema */ $white-light: #FFFFFF; $white-normal: #ededed; $white-dark: #ededed; $gray-light: #faf9f9; $gray-normal: #f5f5f5; $gray-dark: #ededed; $gray-darkest: #c9c9c9; $green-light: #38ae67; $green-normal: #2FAA60; $green-dark: #2CA05B; $blue-light: #2EA8E5; $blue-normal: #2D9FD8; $blue-dark: #2897CE; $blue-medium-light: #3498CB; $blue-medium: #2F8EBF; $blue-medium-dark: #2D86B4; $orange-light: rgba(252, 109, 38, 0.80); $orange-normal: #E75E40; $orange-dark: #CE5237; $red-light: #F43263; $red-normal: #E52C5A; $red-dark: #D22852; $border-white-light: #F1F2F4; $border-white-normal: #D6DAE2; $border-white-dark: #C6CACF; $border-gray-light: rgba(0, 0, 0, 0.06); $border-gray-normal: rgba(0, 0, 0, 0.10);; $border-gray-dark: #C6CACF; $border-green-light: #2FAA60; $border-green-normal: #2CA05B; $border-green-dark: #279654; $border-blue-light: #2D9FD8; $border-blue-normal: #2897CE; $border-blue-dark: #258DC1; $border-orange-light: #fc6d26; $border-orange-normal: #CE5237; $border-orange-dark: #C14E35; $border-red-light: #E52C5A; $border-red-normal: #D22852; $border-red-dark: #CA264F; /* header */ $light-grey-header: #faf9f9; /* * State colors: */ $gl-primary: $blue-normal; $gl-success: $green-normal; $gl-info: $blue-normal; $gl-warning: $orange-normal; $gl-danger: $red-normal; /* * Commit Diff Colors */ $added: #63c363; $deleted: #f77; /* * Fonts */ $monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace; $regular_font: 'Source Sans Pro', "Helvetica Neue", Helvetica, Arial, sans-serif; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/lists.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/lists.scs0000644000175600017570000000427412672631600031123 0ustar pravipravi/** * Well styled list * */ .well-list { margin: 0; padding: 0; list-style: none; > li { padding: 10px 15px; min-height: 20px; border-bottom: 1px solid #eee; border-bottom: 1px solid rgba(0, 0, 0, 0.05); &:after { content: " "; display: table; clear: both; } &.disabled { color: #888; } &.unstyled { &:hover { background: none; } } &.warning-row { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } &.smoke { background-color: $background-color; } &:hover { background: $row-hover; } &:last-child { border-bottom: none; &.bottom { background: $background-color; } } .list-item-name { float: left; position: relative; top: 3px; } p { padding-top: 1px; margin: 0; color: $gray-dark; img { position: relative; top: 3px; } } .well-title { font-size: $list-font-size; line-height: 18px; } } } /** light list with border-bottom between li **/ ul.bordered-list, ul.unstyled-list { @include basic-list; &.top-list { li:first-child { padding-top: 0; h4, h5 { margin-top: 0; } } } } ul.unstyled-list > li { border-bottom: none; } ul.task-list { li.task-list-item { list-style-type: none; } ul:not(.task-list) { padding-left: 1.3em; } } ul.content-list { @include basic-list; margin: 0; padding: 0; > li { border-color: $table-border-color; color: $gl-gray; .avatar { margin-right: 15px; } .controls { padding-top: 1px; float: right; .btn { padding: 10px 14px; } } } } .panel > .content-list { li { margin: 0; padding: $gl-padding; } } ul.controls { padding-top: 1px; float: right; list-style: none; .btn { padding: 10px 14px; } > li { float: left; margin-right: 10px; &:last-child { margin-right: 0; } .author_link { display: inline-block; .avatar-inline { margin-left: 0; margin-right: 0; } } } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/avatar.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/avatar.sc0000644000175600017570000000327012672631600031053 0ustar pravipravi.avatar { float: left; margin-right: 12px; width: 40px; height: 40px; padding: 0; @include border-radius($avatar_radius); &.avatar-inline { float: none; margin-left: 4px; margin-bottom: 2px; &.s16 { margin-right: 4px; } &.s24 { margin-right: 4px; } } &.group-avatar, &.project-avatar, &.avatar-tile { @include border-radius(0px); } &.s16 { width: 16px; height: 16px; margin-right: 6px; } &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; } &.s36 { width: 36px; height: 36px; margin-right: 10px; } &.s40 { width: 40px; height: 40px; margin-right: 10px; } &.s46 { width: 46px; height: 46px; margin-right: 15px; } &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; } &.s110 { width: 110px; height: 110px; margin-right: 15px; } &.s140 { width: 140px; height: 140px; margin-right: 20px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; } } .identicon { text-align: center; vertical-align: top; &.s16 { font-size: 12px; line-height: 1.33; } &.s24 { font-size: 14px; line-height: 1.8; } &.s26 { font-size: 20px; line-height: 1.33; } &.s32 { font-size: 20px; line-height: 32px; } &.s40 { font-size: 16px; line-height: 40px; } &.s60 { font-size: 32px; line-height: 60px; } &.s90 { font-size: 36px; line-height: 90px; } &.s110 { font-size: 40px; line-height: 112px; font-weight: 300; } &.s140 { font-size: 72px; line-height: 140px; } &.s160 { font-size: 96px; line-height: 160px; } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/flash.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/flash.scs0000644000175600017570000000041612672631600031054 0ustar pravipravi.flash-container { cursor: pointer; margin: 0; font-size: 14px; width: 100%; z-index: 100; .flash-notice { @extend .alert; @extend .alert-info; margin: 0; } .flash-alert { @extend .alert; @extend .alert-danger; margin: 0; } } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/typography.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/typograph0000644000175600017570000000776712672631600031225 0ustar pravipravi@mixin md-typography { color: $md-text-color; word-wrap: break-word; a { color: $md-link-color; } img { max-width: 100%; } *:first-child { margin-top: 0; } code { font-family: $monospace_font; white-space: pre; word-wrap: normal; } kbd { display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #555; vertical-align: middle; background-color: #FCFCFC; border-width: 1px; border-style: solid; border-color: #CCC #CCC #BBB; border-image: none; border-radius: 3px; box-shadow: 0px -1px 0px #BBB inset; } h1 { font-size: 1.3em; font-weight: 600; margin: 24px 0 12px 0; padding: 0 0 10px 0; border-bottom: 1px solid #e7e9ed; color: #313236; } h2 { font-size: 1.2em; font-weight: 600; margin: 24px 0 12px 0; color: #313236; } h3 { margin: 24px 0 12px 0; font-size: 1.1em; } h4 { margin: 24px 0 12px 0; font-size: 0.98em; } h5 { margin: 24px 0 12px 0; font-size: 0.95em; } h6 { margin: 24px 0 12px 0; font-size: 0.90em; } blockquote { color: #7f8fa4; font-size: inherit; padding: 8px 21px; margin: 12px 0 12px; border-left: 3px solid #e7e9ed; } blockquote p { color: #7f8fa4 !important; font-size: inherit; line-height: 1.5; } p { color: #5c5d5e; margin: 6px 0 0 0; } table { @extend .table; @extend .table-bordered; margin: 12px 0 12px 0; color: #5c5d5e; th { background: #f8fafc; } } pre { margin: 12px 0 12px 0; font-size: 13px; line-height: 1.6em; overflow-x: auto; @include border-radius(2px); } p > code { font-weight: inherit; } ul, ol { padding: 0; margin: 6px 0 6px 28px !important; } li { line-height: 1.6em; } a[href*="/uploads/"], a[href*="storage.googleapis.com/google-code-attachments/"] { &:before { margin-right: 4px; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; content: "\f0c6"; } &:hover:before { text-decoration: none; } } /* Link to current header. */ h1, h2, h3, h4, h5, h6 { position: relative; a.anchor { // Setting `display: none` would prevent the anchor being scrolled to, so // instead we set the height to 0 and it gets updated on hover. height: 0; } &:hover > a.anchor { $size: 16px; position: absolute; right: 100%; top: 50%; margin-top: -$size/2; margin-right: 0px; padding-right: 20px; display: inline-block; width: $size; height: $size; background-image: image-url("icon-link.png"); background-size: contain; background-repeat: no-repeat; } } } /** * Headers * */ body { -webkit-text-shadow: rgba(255,255,255,0.01) 0 0 1px; } .page-title { margin-top: $gl-padding; line-height: 1.3; font-size: 1.25em; font-weight: 600; &:last-child { margin-bottom: 0; } } .page-title-empty { margin-top: 0px; line-height: 1.3; font-size: 1.25em; font-weight: 600; margin: 12px 7px 12px 7px; } h1, h2, h3, h4, h5, h6 { color: $gl-header-color; font-weight: 500; } /** CODE **/ pre { font-family: $monospace_font; &.plain-readme { background: none; border: none; padding: 0; margin: 0; font-size: 14px; } } .monospace { font-family: $monospace_font; font-size: 90%; } code { &.key-fingerprint { background: $body-bg; color: $text-color; } } a > code { color: $link-color; } /** * Apply Markdown typography * */ .wiki { @include md-typography; } .md { @include md-typography; } /** * Textareas intended for GFM * */ textarea.js-gfm-input { font-family: $monospace_font; color: $gl-text-color; } .md-preview { } .strikethrough { text-decoration: line-through; } h1, h2, h3, h4 { small { color: $gl-gray; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/common.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/common.sc0000644000175600017570000001314012672631600031062 0ustar pravipravi/** COLORS **/ .cgray { color: $gl-gray; } .clgray { color: #BBB } .cred { color: $gl-text-red; } .cgreen { color: $gl-text-green; } .cdark { color: #444 } /** COMMON CLASSES **/ .prepend-top-10 { margin-top:10px } .prepend-top-default { margin-top: $gl-padding !important; } .prepend-top-20 { margin-top:20px } .prepend-left-10 { margin-left:10px } .prepend-left-20 { margin-left:20px } .append-right-10 { margin-right:10px } .append-right-20 { margin-right:20px } .append-bottom-10 { margin-bottom:10px } .append-bottom-15 { margin-bottom:15px } .append-bottom-20 { margin-bottom:20px } .append-bottom-default { margin-bottom: $gl-padding; } .inline { display: inline-block } .center { text-align: center } .underlined-link { text-decoration: underline; } .hint { font-style: italic; color: #999; } .light { color: $gl-gray; } .slead { color: $gl-gray; font-size: 15px; margin-bottom: 12px; font-weight: normal; line-height: 24px; } .tab-content { overflow: visible; } pre { &.clean { background: none; border: none; margin: 0; padding: 0; } &.well-pre { border: 1px solid #EEE; background: #f9f9f9; border-radius: 0; color: #555; } } hr { margin: $gl-padding 0; } .dropdown-menu > li > a { text-shadow: none; } .dropdown-menu-align-right { left: auto; right: 0px; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background: $gl-primary; color: #FFF; } .str-truncated { @include str-truncated; } .item-title { font-weight: 600; } /** FLASH message **/ .author_link { color: $gl-link-color; } .back-link { font-size: 14px; } table a code { position: relative; top: -2px; margin-right: 3px; } .loading { margin: 20px auto; height: 40px; color: #555; font-size: 32px; text-align: center; } span.update-author { display: block; color: #999; font-weight: normal; font-style: italic; strong { font-weight: bold; font-style: normal; } } .user-mention { color: #2FA0BB; font-weight: bold; } .field_with_errors { display: inline; } p.time { color: #999; font-size: 90%; margin: 30px 3px 3px 2px; } .highlight { text-shadow: none; } .thin_area{ height: 150px; } // Fixes alignment on notes. .new_note { label { text-align: left; } } // Fix issue with notes & lists creating a bunch of bottom borders. li.note { img { max-width:100% } .note-title { li { border-bottom:none !important; } } } .markdown { img { max-width: 100%; } } .wiki_content code, .readme code{ background-color: inherit; } .project_member_show { td:first-child { color: #aaa; } } .rss-icon { img { width: 24px; vertical-align: top; } strong { line-height: 24px; } } .show-suppressed-diff, .show-all-commits { cursor: pointer; } .git_error_tips { @extend .col-md-6; text-align: left; margin-top: 40px; pre { background: white; border: none; font-size: 12px; } } .error-message { padding: 10px; background: #C67; margin: 0; color: #FFF; a { color: #fff; text-decoration: underline; } } .browser-alert { padding: 10px; text-align: center; background: #C67; color: #fff; font-weight: bold; a { color: #fff; text-decoration: underline; } } .warning_message { border-left: 4px solid #ed9; color: #b90; padding: 10px; margin-bottom: 10px; background: #ffffe6; padding-left: 20px; &.centered { text-align: center; } } .gitlab-promo { a { color: #aaa; margin-right: 30px; } } .milestone { &.milestone-closed { background: #f9f9f9; } .progress { margin-bottom: 0; margin-top: 4px; } } .control-group { .controls { span { &.descr { position: relative; top: 2px; left: 5px; color: #666; } } } } img.emoji { height: 20px; vertical-align: middle; width: 20px; } .chart { overflow: hidden; height: 220px; } .description-block { @extend .light-well; @extend .light; margin-bottom: 10px; } table { td.permission-x { background: #D9EDF7 !important; text-align: center; } } .dashboard-intro-icon { float: left; text-align: center; font-size: 32px; color: #AAA; width: 60px; } .dashboard-intro-text { display: inline-block; margin-left: -60px; padding-left: 60px; width: 100%; } .btn-sign-in { margin-top: 8px; text-shadow: none; } .side-filters { fieldset { margin-bottom: 15px; } } .footer-links { margin-bottom: 20px; a { margin-right: 15px; } } .well { margin-bottom: $gl-padding; } .search_box { @extend .well; text-align: center; } #nprogress .spinner { top: 15px !important; right: 10px !important; } .header-with-avatar { h3 { margin: 0; font-weight: bold; } .username { font-size: 18px; color: #666; margin-top: 8px; } .description { font-size: $gl-font-size; color: #666; margin-top: 8px; } } .profiler-results { top: 73px !important; .profiler-button, .profiler-controls { border-color: #EEE !important; } } .dropzone .dz-preview .dz-progress { border-color: $border-color !important; } .dropzone .dz-preview .dz-progress .dz-upload { background: $gl-success !important; } .space-right { margin-right: 10px; } .alert, .progress { margin-bottom: $gl-padding; } .project-item-select-holder { display: inline-block; position: relative; .project-item-select { position: absolute; top: 0; right: 0; width: 250px !important; visibility: hidden; } } .content-separator { margin-left: -$gl-padding; margin-right: -$gl-padding; border-top: 1px solid $border-color; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/mixins.scssgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework/mixins.sc0000644000175600017570000000424112672631600031103 0ustar pravipravi/** * Generic mixins */ @mixin box-shadow($shadow) { -webkit-box-shadow: $shadow; -moz-box-shadow: $shadow; -ms-box-shadow: $shadow; -o-box-shadow: $shadow; box-shadow: $shadow; } @mixin border-radius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; -ms-border-radius: $radius; -o-border-radius: $radius; border-radius: $radius; } @mixin border-radius-left($radius) { @include border-radius($radius 0 0 $radius) } @mixin border-radius-right($radius) { @include border-radius(0 0 $radius $radius) } @mixin linear-gradient($from, $to) { background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to)); background-image: -webkit-linear-gradient($from, $to); background-image: -moz-linear-gradient($from, $to); background-image: -ms-linear-gradient($from, $to); background-image: -o-linear-gradient($from, $to); } @mixin transition($transition) { -webkit-transition: $transition; -moz-transition: $transition; -ms-transition: $transition; -o-transition: $transition; transition: $transition; } /** * Prefilled mixins * Mixins with fixed values */ @mixin shade { @include box-shadow(0 0 3px #ddd); } @mixin solid-shade { @include box-shadow(0 0 0 3px #f1f1f1); } @mixin str-truncated($max_width: 82%) { display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: top; white-space: nowrap; max-width: $max_width; } /* * Base mixin for lists in GitLab */ @mixin basic-list { margin: 5px 0px; padding: 0px; list-style: none; > li { @include clearfix; padding: 10px 0; border-bottom: 1px solid #EEE; display: block; margin: 0px; &:last-child { border-bottom: none; } &.active { background: #f9f9f9; a { font-weight: 600; } } &.hide { display: none; } &.light { a { color: $gl-gray; } } } } @mixin input-big { height: 36px; padding: 5px 10px; font-size: 16px; line-height: 24px; color: #7f8fa4; background-color: #fff; border-color: #e7e9ed; } @mixin btn-big { height: 36px; padding: 5px 10px; font-size: 16px; line-height: 24px; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/print.scss0000644000175600017570000000116312672631600027301 0ustar pravipravi/* Generic print styles */ header, nav, nav.main-nav, nav.navbar-collapse, nav.navbar-collapse.collapse {display: none!important;} .profiler-results {display: none;} /* Styles targeted specifically at printing files */ .tree-ref-holder, .tree-holder .breadcrumb, .blob-commit-info {display: none;} .file-title {display: none;} .file-holder {border: none;} .wiki h1, .wiki h2, .wiki h3, .wiki h4, .wiki h5, .wiki h6 {margin-top: 17px; } .wiki h1 {font-size: 30px;} .wiki h2 {font-size: 22px;} .wiki h3 {font-size: 18px; font-weight: bold; } .sidebar-wrapper { display: none; } .nav { display: none; } .btn { display: none; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/application.scss0000644000175600017570000000220012672631600030441 0ustar pravipravi/* * This is a manifest file that'll automatically include all the stylesheets available in this directory * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at * the top of the compiled file, but it's generally better to create a new file per style scope. *= require jquery-ui/datepicker *= require jquery-ui/autocomplete *= require jquery.atwho *= require select2 *= require_self *= require dropzone/basic *= require cal-heatmap */ /* * Welcome to GitLab css! * If you need to add or modify UI component that is common for many pages * like a table or typography then make changes in the framework/ directory. * If you need to add unique style that should affect only one page - use pages/ * directory. */ /* * GitLab UI framework */ @import "framework"; /* * NProgress load bar css */ @import 'nprogress'; @import 'nprogress-bootstrap'; /* * Font icons */ @import "font-awesome"; /* * Page specific styles (issues, projects etc): */ @import "pages/**/*"; /* * Code highlight */ @import "highlight/**/*"; /* * Styles for JS behaviors. */ @import "behaviors.scss"; gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/stylesheets/framework.scss0000644000175600017570000000216412672631600030144 0ustar pravipravi@import "framework/fonts"; @import "framework/variables"; @import "framework/mixins"; @import 'framework/tw_bootstrap_variables'; @import 'framework/tw_bootstrap'; @import "framework/layout"; @import "framework/avatar.scss"; @import "framework/blocks.scss"; @import "framework/buttons.scss"; @import "framework/calendar.scss"; @import "framework/callout.scss"; @import "framework/common.scss"; @import "framework/files.scss"; @import "framework/filters.scss"; @import "framework/flash.scss"; @import "framework/forms.scss"; @import "framework/gfm.scss"; @import "framework/gitlab-theme.scss"; @import "framework/header.scss"; @import "framework/highlight.scss"; @import "framework/issue_box.scss"; @import "framework/jquery.scss"; @import "framework/lists.scss"; @import "framework/markdown_area.scss"; @import "framework/mobile.scss"; @import "framework/nav.scss"; @import "framework/pagination.scss"; @import "framework/panels.scss"; @import "framework/selects.scss"; @import "framework/sidebar.scss"; @import "framework/tables.scss"; @import "framework/timeline.scss"; @import "framework/typography.scss"; @import "framework/zen.scss"; gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/0000755000175600017570000000000012672631600024140 5ustar pravipravigitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/progress_bar.gif0000644000175600017570000000075612672631600027327 0ustar pravipraviGIF87a8 ֖٫ܵ,8@pH,Ȥr8ШtJR/cz8| zn~c,   8*\Ȱ"JHŋ3" Ǐ CI(S\ɲ˗@ȜI͛8s@ JhH*]ʴ ;gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/onion_skin_sprites.gif0000644000175600017570000000104412672631600030545 0ustar pravipraviGIF89a>4fffnnnӫĊųttt͹ϠqqqΪsssǝmmmppp! XMP DataXMPD?0B26E70596947" xmpMM:InstanceIRDF> !4,>@-F,`\ƐfTJP*\/ҳq]Ew]^g}g}xuYrtUnEPCk3P200 )0 !+ҭ0˭(  21&K' WZ D%­Jd*ḴalăU,X  ĠǒU;gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/favicon.ico0000644000175600017570000001246612672631600026272 0ustar pravipravi h& (  @%'{&A'n&o&C&&&'T'S&&&!&&&n(E)E&l&&&#&[&&&p&b)C)B&c&p&&&Y&&&&&x&m'U)C)C'T&l&y&&&& &&&&&m&m)E)C)C(F&m&m&&&&&&&&l&m&d)C)C)C)B&c&m&l&&&&&&m&m&m'V)C)C)C)C'V&l&m&n&&q&&g&_&_&_(I)C)C)C)C(I&_&_&_&g&%)B)B)B)B)C)B)B)B)B)C)C)C)Cs)C)C)C)C{)C!)C)C)C))C)C)C)C))C)C)C)C)Cw)C)C)C{)C)C)C)C)C( @ %(q&&M'|Y&&'b'_&&&&&})I(O&z&&#&&&k&&&j)D)A&n&&&i&&&&&&i'c)B)A'_&m&&&&&;&&&&m&o(P)C)D)K&n&l&&&&E&&&&&&v&m&p)@)C)C)E&k&n&p&&&&&& &&&&&~&m&m'_)B)C)C)A&e&l&l&&&&&&&&&_&&&&&&k&m&m(O)D)C)C)B(O&o&m&k&&&&&&]&&&&&&&&&k&m&m&m)E)C)C)C)C)@&n&m&m&k&&&&&&&&&&&&&&&n&m&m&m'f)@)C)C)C)C)C'`&l&m&m&o&&&&&&&!&&]&&&&&&&x&n&m&m&p)N)C)C)C)C)C)D(Q&m&m&m&m&x&&&&&&&s&&&&&&&&l&m&m&m&m)C)C)C)C)C)C)C)D&o&m&m&m&n&&&&&&&&&&&&&&l&m&m&m&l'c)C)C)C)C)C)C)C)@'d&m&m&m&m&j&&&&&&&O&&&&&m&m&m&m&m&m(U)C)C)C)C)C)C)C)C(N&o&m&m&m&n&k&&&&&m&&&&&q&n&m&m&m&m&p)C)C)C)C)C)C)C)C)D)E&l&m&m&m&m&m&r&&&&&&&l&m&m&m&m&m&e)@)C)C)C)C)C)C)C)C)B&f&l&m&m&m&m&m&|&&&a&&n&o&o&o&o&o&p(Q)D)C)C)C)C)C)C)C)C)B(T&q&o&o&o&o&o&n&&m&(Q(Q(O(O(O(O(O(O(O)H_)DU)CS)CS)CS)CS)CS)CS)CS)CS)CS(DC(O(O(O(O(O(O(O(O(e([)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)C)C)C})C)C)C)C)C)C)Cm)C)Ca)C)C)C)C)C)C)Cg)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)Ce)C)C)C)C)C)C)Cc)C)C)C)C)C)C)C)C)C)C)C)C)C)D)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)Cm)C)C)C)Cy)C*F)C)C)C)C)C)C)C)C/)C)C)C)C)C)C)Cs)Cm)C)C_)Ckgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/gitorious-logo-blue.png0000644000175600017570000000075712672631600030566 0ustar pravipraviPNG  IHDR@@iqbKGD pHYs.#.#x?vtIME31|IDATx횱0 Esdl@ hY2IJ-*q#l+No]XzeYv:]㧱ZԤt^GH \.bfwRD$-tO秆\""g8Q`IP ?]#"`-'WMZ̝˥my3=-js5P nι$&Yu-o7 @DVXsLkLBOQ(bx\cYxb1ٳ)C-9z$R|s9 $Rk|i!8˪5CR0ڣ@TRr^ Tk$'qh{8}2^:pIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/emoji.png0000644000175600017570000100255512672631600025761 0ustar pravipraviPNG  IHDRH4SPLTEVbszTd]*`}V023j5FItWWJdiŖ񱹼iONP^BCKSMZABCVWXwD_ei|`ODTY\NXH۶r쳇@ABABEOBڷQl壵qM9NYÛɛsNZ{loqlQHKRVVn{g {DlgnTP]?AC,5]evΖkNߧuFIIJAWe,C47:wBB?|Ԓ8؂+faߤ`#eu}"􀄟ucOٺpϭ=@bNW@ͬdQwCgXiu'gB٥pӱ}ѿGرҚ@GyTUy$LԯYh9֦v~ZUSV$ѷ5fsz)hP./प3azl)(*έA|IG:=yRs>A6?FIa&W͟J{_tE+y^nڕKHYGAoƘ hq^L\gB>CGB‰gV2ϫMץ|IMO%ZG=b# azb7ҕhpL݁YMF˱WK8+nZ@|ǭvW0u9ܷYtRNS 3!rU3Vk36t6p>1Mas[MsU_pYnTsqPkunrPB[rO฽ދh&PZMIDATxڤ{PTUﶻ4߹H&ABɚ!ISRb q|AP YԘN996=&ӬXub銐a9gٻl/{\APΒ(Ul1͖ 03E<3N.xH{ɲ65<.ǓmVeh6޴zPB( LBu;^i sQ䒳*RlLd!+V$ ]@dch&r~2|.[sObb, vHo…Њ+*q3ccg;O,J!e)1DS%<<`PЎLxʹUfPGUhvvbQ)M&dK%Ke3ʾg` ;@|wOƑ۴׫h0h ^iK|AV)HؔC_>Ø1G6>sy_QUgp&xAskK{zT\kwy_ WW3VN$)u$jMJI=+AU]ؑefrۢ*͢*~;,%IӻD~E37 aϢ6gx zU kGgYMs!ףACdX2yt,4Tٔ `)ӕNElD?葏o>nYt/bD.5AglpbF\.gT %AYQ޳$I%}R"tY>ݻNQۍGqh`(bzQH:NxwۂDu?8 y[fۦ)b:}rG)pڝ H$$f2{*]$ uޓD.&NR=[^!=u`]ݗE0jed;?$p@sp"G>$5\.n P}2XV=^J.t Hec!`ڗ&훀F،@GP4D D ;e[pppNq0*:Y׶GrUpBy yҼpžߐ7}L7JB(祪v;Rˢ( h..* s 8M[sid q%iytv'$Z4YmRh"#}SIm}(03, H%NSa1j SD_12b k ~&[,!INl r ?#cgpUȹ2Sw(l%$ZrIRzH⺞(4+^Vo0Chh7a&'G`0٤!H4GpG0)jzr)H͹I)yN*jn;gj4ehLz> _[\L@jk1Ul4{F ڈ ml^d z{U>~\-y!pzD-CmO\< "Hgq'$kj9H`qH \k##==V Rt7HjuH^ LAJt8;ǁ#L(H!HԶd4){'@|D@`KyAo/-?k79Nd=ժ&6O@`+UJ*uTW~v Z/5P {$w].BP\3rΜsd9Bal72 +J;4$| n^8pbͱbj'KqؐqX™g!D8bbD)HvxSr.jZlHvC~޼ 5kJRSK" T<=*KQt%bd%0vfXI {!n3FjPI\[$̑(H!" JݔEF·whg F dSAK"?YSSSSY&. 4Zv $G"_&#@ h\qV)dyRЬnЏl )xpPI!ӧL $pHKoѺ(x衂?\ږxlvń5͙"$RYT%9ÜJ!fE M\4naQ~>Ʒ$=zM>N){!]%##H@-p2JA@$(cf =`N@R[߈ x$;4w=GYV$> 3Hq(aDHvu˳Ÿ[CCwH%9LJ8GHh:8 Sۨ BArTPӈJCL 8bj GuuC:RGiX5h/S~m ]\ iR*z>`d%er}ONJc?ő}^J Rk㍧O7:Skf@z*ꁦlQ>XV%Dz w~ 9d\v6>LW"謱P!XP,i[ 0;#]mAIr4W~Hx<ݔJV +r<cț$ ꤀#'Ԝ8Օf¨5 voYT* # c;kYm,pI8qubuA:7@ʰfdfa6$}:+t JF"sz@9YYcl'l3^qlle AZ'bS,(8J߀eB__Dߐ!z$YrΝ{~oQriK Gg(HR/A;# Vrd)TmE򀟺t jX6F*dL4fOB'x#B&  B 4H<9Q^6 zAF|s$ -^ F X.}k(U )a_g]* ̴m;OZRAIKp tSW3߻T UXjhiVa~ث df8G{x[glk i9M'&)H[\ = %R* \+qJXo?B ͵ꮡ: R&} 1Rp+449HRD : j H*ƑH/F0 9ڝv A j!vI͂Igh5 + C;hO BRȩAhD~<|.ih` ,דR|!AjIl/]DO o\`lG+^@-B^ 8BcHm۠=Sɪ Bi!/: =\2]_s!H#(v8n,(9]gHGrJ0`ծ] ޿МȎ,0EN*!Fd.6| ` TAoV b}8b JRZ',6)H٣#lVP+q=abtIXņ1vpT <.bɧؠņё@ņ4HP>M42E8bR`3Ǒ|f%#qPxWlR)G'S_>knFXS#zFhV.P* 8Dʠ0cIXQp0hl\.vFhbPbA*t0#X,6ؘXl3щU;ybMG䏂{vzz#ņVu(Zlhr@t?>O`) B8K* dQ$wҬoW+\?/^2(8KV9/K0C}-Ph7%)ϤĚ/oHt ޥ{t%_[sdT^QT?2<$ޱ@o_[=Sj a 2p@cͬY)dpqkkjBA]?8 Hf6o C;T @ZFQ&&/I:kkIrehM1?ڵhhʕr ')]nhb$a[aI@.vHjÚqWO? +M|@Dl?/ԨpT=dMPيl/U~7{%Gmxdb( X逬N: \@ҹ Q zSg}"ptw@VXK}oWT79+q:n5':HFGҎ)H!|7ÐeA$ $ic 4ȁZÌkA*nt#F5h#`4 0 KAKQAڅA4;(H=VTiܠ͹]+cr͓H $kKi讕Gvpn8HOlsKBVKxLZBzt!.2!)GN?DvTQr1 YW$#s1r>`JgSkz%^(VA9bz4}g1d0!"R?%jLW} #Q>9b V6two@^$>c4TAl?F6D*vݕU4E?FAT B\zz0ݷ!4rRtQ$Jz# } = `!/> xHkst`z=5}k)$N,;.vuH1(r@: h3Jqƾ=H8ݎ Bnw*sI׀5oϹmoPm5Xy }v3}q gj{[LIK5mutW ;.ܺ#%ݙt$hնP6L3&o5j~N Vß ql47Nvpt ٲ|S \Rd}ʣ9$,L.up[-blȖ ³QBsҙ<62U=g09mlH{vvvtQ4ٴ\]&6Dˤ`"OWィ鬭U32بY9V_ȍצf*JʸVZE_^ &_cK<JE)T$ٯGl~Ohr ag2y/@߆,O= ˲|\2͸_PrMI:!XȈ7wԩASៀ6]?ۛn͎`óVC+o{ulh1M9)@&= ճ!K! Q( Sy|/;tq_EsTLEqP}ZrYIg1 Ha హ=`Őh$uXa֙LʳFD+8Ґ$&P%HLxL c |\E)̈́lJUyN\8wN%䓪$a*?Rcqg"A8$Ml9)H;;v>n6U_%TY//`Š*lXE>IlNH—ǹxMLؓm@4_fSٓܽtFlMlXSA 3MɃ8Hx̓lB{8Q/{X<"0Ǟs5-jPmBxl4$$HYh @?G-sGFɋ_ INA3k@:18ӳlV[leؿϚBX#AhYNNK8%r2$-HϸDlg焿?^)`Pb87}0iC f੝Py3s֩sr228J_3s#se7/X.OD =75Q?wSr!PozZ`A@ULu!ФPn7BB-,8z6ԵZ[)L&Cͭج;'B2DK}4"pqG[c@ʰhpDk/@O؞w_."UQDi& *$9TȒb;_ёdiz$ Hעuݠٜd.!S-TbfiA I=HXZNUXXqBdxr)r_HgZʌS:;lTZذ,;~/.҆ hͮ1͘ r;G&^Vx,BD8!@2%$47Aj4[J:Ng8 +dvJ@!gՃ lސǪ\ L2’{\58{J فĮ~$uEIpy:Bbދ?3|ҽL}D$0t Nv{q5TtVdK[Vc0MH6Nt6c+X=%=xzt.Rq Z`$HMF%|D"g-:A!WgϸH?+‘0 NW1vMIcQ@V($AB{s6m¡ ;ۛZZ6*l`dZLTRj/}|z!z^K8H;93!9h)8 ^K}WcRxۀ̎"[tJR4F]="|#gâEg'vj=Bmei $}.H-XN~XP/{6\]_ <ۛ[ݴ4+ܜ|5 - =>K±^卷-RڟlFѓj?裐WH \S,ep9/M-jD2<9]]YsϮiecj r($S;i$8A;Zc77^l{u bI$ȯ i|H$UG$DҧvSZL ڵ/Pxٜ[%5!Rfo{("qz6|ٰs""3! y-_geo`YztmgAO@fS`6<Ze0;W<zzU5My4n^kQӚ fNk$=H^Ӄd\r~i5nzzP3H_Et|vs_W?A k)Y`zkeV@¿td$]3 AlD=\^KiYޯfn; [Nj$<}Vt 8"Mcvڐ3v4bOWH2""%BHӂd(LLbƝ;aDRmpd,3<CZHxAMݪJGskjq)iUy@ <4)m}%n_l[XG*eƪ6R_iR;4 tR3) #-`3v(6)+tJ!>m}Ƴ0'kioWNN)R-@1 .y ;6HIƷa*ో $blPl` ƳQl%Һk̓kņXlY~{e\ ,6xMIi~PNMwpg I ;Ů3iAd׀$W-ƈi`JN=Yl9E AZ'b zC#r]y6rφxɹ ͙SDJ$<+6xO[l09胰.^0k $I 9Q{6`XVdDr1 RqbmԙiH)&UcdIq}R>U8>!Kw,b$Z#:GeExsʥ3]n,al:z2!gcӂd8 Ez6$ !ID HYlp_Z$P&f $hT *Pd!@C%g0J³ X׿DNԅB^m-բLJʗ?r=|Ж-gor:Ͳh"ܿ#!.߿߿?O.9ϛ8>(8j eЧ Jt>TGD -"8*pPi8Y $P/؎kݪ[v-H6ӟK bhQ|@(Cļ]?+ u=pn>G)\$C D$X"@ˌ+- =fIXLA.l$DZ+pφW^yz$W["iIѺz\&/O3E]8}z3_zZO(*l;- <l0R3ìJ10BHerz=XEs,E LDwιݻTS{zeV&:3~I35iU__?$.>QMI@ @#3XuWHw01S䚏Id  `qj0B3Wu(q8ɗ~o%"Pճo.].\smAVFȩ&_lxk[ј|E=l['qܢٳ_-O//R,#j\P8*%BQ$S #T@%d x5/ѨlC}Č m0WmI}D$%S.]dcH|,чgCP2ȫ=D$n 7iW GqXvG{+T$U O_ _Y_ا[(hY?$rn,)y5"~/{PɀbpydяgCiFzI zm  WYEE]6 ak5I [ Hճ`<\`^'#/HʓySj.z?Zj{xAS;Fq @w,5 gz\ g{ʣCq^BkKUUAf.bBe,p; <6^{ ?$H3jU5?Y ]JSl bnڇgCc$m' YP/z67:1 A9^Kـ Ij /=,uٽDyg`r2ͼv!hݵ3MbNcU9H+/6JTFh&n韷r*5 d3S)XrADmvTp*3x0^=lhx`P .h_C/KN`%_׳!4 |֪UHzlo@_b+Z*$~i F⾖Uu:mXłuD٠?@r=>.Уk|&O4!E().QdC&?oHҳ Y d)=ىM[b$&2AiKpwWφMLhCDŽ [n޼uko[7Dn~[3FU<VVWڕ\3Or$-)tS&QǓp Ur"t wVdz㨵ͳy6譃iorLr$I)ץ[SH 9  b쁞/ܾ)7ҷxgϽgnhg:H\\Oa8ϣ$>[U|$x-# H2" HV, 'j 7фGU'?^v\MHZKx@RIBYmKaK1ִyh M%^1!7SRT&INZ-= I7,Zp`V U{Ng^ %Q1$͉=;VD O O0('i3a6͈!v"_d=FԣqG|IhWφD#:/(%HS-S"O'}7jv3q$JIZ@2\ Cq( u)C\g ۣwcqzC6:kq|IJ7;@s&Ӹ3w+s%?>ep/ ?RyD$ \WjSyڲ,p}*HOS~,C@题-:%)s`DL$<\!Ћ:ٚD IφRrUGe:0NgWM<$f:/7aU3H}$ճ!}` ]x6p~y1+ $E45v3 i2P³>waTC5J8I5 &=f% ĤY_j*H$4~CZ&0-Fa~"P ${n ~O!x@͵S8j1Vl̈LvMh/@IK'HC <ǵ}(4KePT9[Yq#vEXt**L) ]7ȐDb Mٕ Aѳ:g,?;|N(ųۍhͧFr@$]uA HFO " Y;Ѷ,s|p`~[czH(%ve@HҳDx6( qI"xrN @Г mY2VeAl݅R7j gä扪gC8>C8@q$@'$R=_D#a$%M Qˮ{Ro!!ٿOFێ )vJlP#ԽG!)ua9IiG<=t 9$<@,ZBh-fsi}0[  B'ꚟQ4?kރ\/AsS$b |3??J?;_~GX<6>RjSN#Ho]u~^a; $kwwٍͦ+{گzƶQtI4Kgw?-Ǒ A3WCRІGEh%@JnHDe %6gl(MO1'Qg0~fm=@R# c ůDLj S1HW"R"'4 gdaqb~WJD2zx6P/l;@b#D'AmkHЊ -^~ uGD?^ tagnH݉ YSNJX$:}_ GX;&Aj{tJmD ?ZP'<ى$Cw^Hh os<܂ /Hq$HgCDy6^@L:6(; N:5gþ}̳a_zAlGҳaz,hG:tHF$, iI~IP="].!@ZjI6͒DO/ bHJk)HN:y+JNb{ 61A I" ?[u&)p8}ӮM;M;Ӯognzߥ׻rmۦk9?մ۝6KS֦TqH # (Tsm]]5C Ԡtb7Ο #yaP_M?9{t-5;!yj4zKKN$nWO \#JS8*~ln^s$A R%Rf֡4zFۡ[N͕ Q7IAȁ3 %H+2/_Ժ3Ws@- 8H?1q>K\CK@Lk"`nZP'."=LĆ!W@GH=)9Yj+= HW!6.g,j=Y 7LRd?u1 @Dzo~T@B I~Ol(JHk d0ᎮJGHII&D@{6H8⎰ PXv iIA$P" !+3GO}$x6d6 %vy݉VV;8N9Ro"Hʬ(j.*&"9!E Hb@!CrM yl]F*]I͠]=>< dv9ol9uߟ"NMC>E&)XWR7H? SM"t֢)BcaZfΣ)B"!=|N—_Pkst Hz G\C A cgB1Eow f -BqH,7rH{YES"OBN3EY]<2[( M;9Eh'm)Bf(L`NoQcP)$=׳A<=`LZ5iŢllQws v*u\` U8s5RjA9ԏ҂tx,VI =2P9"@Qa]?~~޹g܌!3P&-s? QA;isVP{H:O C P5-פUEφ=࿿Bo$%El2 Ƒ,\[ۺ 7sn8g5Bޜ$/9$8 6GL ݚv( ')18 ,]~h3qwφ\L/n H*7J*Q Ƴ?[_WDJ]]=~VHN w=d?Pا?6>}Q_/֮_9)4&tH4II eQpYyÆhmH S0N>H+/5(5|a_$vTQڢ|c ҳʭm@Z=YWٺRfGK2uMf͠WB< Wto94CR56nR C ".r _-57ګҪJz¦{A{6@&CRsvɎ1;MczF.|{ o~]ϡ?Ooy^p0b ' R *l49&Q\|XdĂfq%C5GE{X.sB q!sW'Z7i>^/veܞ T=iUMK_Jp'<lҳF ڏ ֬Y†vzi׮$ f!>tgZ1w8^ҁY#;kt}97r$IZEX:5>7@$yu4jQ͋,UDq,*I6v'6XW4Ϗ( 蘢AR] *HOuĽ}۵%Hɑ$ɇ1{NIX_|̎Ks y>O<5  ;fCCCkq&wdGI=Tk,({ID*Cu/Ә1|$6g=ʋO3y3lJc0HQ9HJ?b[~?"1gg:RZ$IV/ 0`z-ɫelِL,"Q'BRH9Kx50+*8f/ MX`g ڙv1҂%ˤi2 XL d]xiARɑ4c0w]cFlfJfma2s#V=4w_p+H/4iz'@:֦&>p;ZR\d%J؀w${O;ӬzvZbdNsfd$>I֊ެ:gV_ ]%w5lmE$IY–kSd=2'̻?R/IW⇚381xi]5/E<[ H42<^BBiښer22閞#K7eGP|"riwnYkQD$\I2.9ҐdI M9x%#G@ҳaiFF܍xD_xcf Gr"n2VY }HU&G??Q#AA] |'Z,'рԹ{tHirwWRVҞɞ8J.*7 2 ɐd>4=G#ix}Mp}}d~< >]`N(E@b YG$XVD(#51vYDI]KQ"!·[Hxl j%e+\epVoI{miUeRawpigR9w 8GM {%fu{7 wwѬU./E;U'-ń:!‘ !';!Me&-`8~~W\ $zO%H`J$I;5$Ѭz /V wgÈH Y R(4*j5 9hh!I$9 sPl;d#Hl y蛲G~GAR#9'ay^U ? `>e y!_ar% IOgmX2s#<>iٳ<( HmjEA$d28bKxƁдxO~&̑$ȎD 2$R|VDS >Z}R_OJ_m蓇+4S64&3s z2 "q9t8 JE7"RMUl56S{׻]i#--]6;u 1Bu}ʐܔVVMOrQ&ʚ(CmWlF<U3]iڍH=~2 勺̯tms$"DEg\N)v]z>8J]YdR)s2H8|lwƍFXăhg'h74>Iv$GG <y $}\# CWBVGIWl%<,Z sFpL Զ-ˬe7qڶ/td"KCeѢ#oi,DkOpd /$}A*D+DmۭGhr74YOi)}yx! @L+DPڮ M +T7:>jEۯƸ}d{sM!φ.*ճAZ͛f M/ޕ.F(F 2S`i?h j .(ǵ>d|O:$zO%G$v>%8R#E)To) 2.f( QmEL-;.$Ls4I+b'T;#`r7Tde%pT%X4&O&hְl=l{/mc=bQegn'HA76\(54`e1Vj>r܇‹d*%0'sZ43l U+$s+[Ѵ 5rUr{,ޗqi~G,IhC2RN΀ko*\2X')vipH8v)>deH<,<֯/R=+6o ` "%M hiR\NI\{3I$'*4>+opr&lT2{Dsx$As̜I+-#4DoV,a l.=6\vWg&(4jM$#G'I@HTŎU$S@J 9bYYb8HťeeHZY>CDq~d>GwFT8J_{9Q $X:Synn ?^z7_e4LYm[cXWmۂ)lRÖ#D-;HeUArk!$;~>mSS2y]$gCֳoU-nH#7dWvfil(k GӖQ\Ͳu4ƨ78>L6%xtWH{K6x9dE.ߓ=y,d q9q'bX+Zd0gBdC$%`sguL@PQU,EE\j.QAиƝƝ4b"Z4QjS5KmH4M%U."q@T6ŵ߹w̛3m_?`fxqs;}'{iCq!B|6u@9[ݐ =[T\$9z}'V>g0;(̆?tffu$֟zF@8ŋ/ܣGGŘ#>Pl 1}KT ^lX|IPUt]%f6b̛ ܳAipA8ܹ^} tBbv%&.DծQJ밙UAB5X-ײ7/9lJKɬ=@]F'vPeL<=Do;M0)o:]~J]yۘeR~SI3S3335[Լ+$$KZ;4-q)T~bS:>9=DkwBfqN<L}%6Ó Gv`$FL7-v8_2TTM(! ͙:u@A2A1$$6~f+_.YArUIEGQ$u oOQ³4*u7kza(=zooYzW.v+]2"ԁ3T~Mwh҉OBёDmKV@5c{l$9 k+9 [Y+S^#溺fLn}: ;RCR b\#-$YH 0ixy$dvggl@vuǷI= b"4#]tL4>_> $UwڱO%M']q˔|)"$jwbJ6˿ld-F$9EJE!nlU9!i+i@Ov6>g4@A$K:Qx-FϝQՎjٟ`f>" nbI_guUR##>FN:rO1&*);߻wbxDׯ=_oK!H|Ԃm)wl 򢈞]i"j;V}wB.| Z.xѿEI']$|2Tl):kp#olQVlblW%Hr*WYV-'~C I;0v!L!c&޹aS~o4w =#aΝ; >IK} p3Rl@6]PSҥ9V gOAO'H;iU- >Ed5LZInQXq\I6 "Ir'!G $%%  4gݨm|@iS}UCQ@n8#+tKneX+LOuX`  ȑgCPH) / 7LY !"I ^/˽!=k,m (oHolռ6 ە#'}An5"@'AMاo M|49_PY>}7%{(IjyΆnfoAYsev@aqsg׶%68W2cs%Hl=iW$N[Ϳƾ)U6fi+v@w=*7l57)7j_U~6k7jnHJšWѽ3h>)gCxAzuىgG!$..oV!Yy ykޙuWoK &]ڳ)N̈fMOvSm8&/[2O+QEγA)aRoCOI30(JOS-lHwh$'_ѶpqI}'~NL7r++OSM_O\ ~)Y͏6N/r8z 68Iu/7zoapnIφҳ3lX3g|k׮́p@Z?X4,[B$^;ZA #ҡH%S\F/[bfS`>I4x괽͵徘9 (@Zø] 92Ոi>L%;zy<$P=S҃O,vkL1m?'rcGKӼ=޳6IE^?H#p$%KBbЗ.$a7k; 7QÏ`[C $낊a2]br :lk0h]gulNV|:K9g@!'/2{4gfM8K0e>LWTTaGK9{׳ʿs7Ul3#&EEv d mr<hUX"əgCAZf;BN$4ЈNZ)"y@<\l4)H&ȑ$9'{RG=mIϛT}Ijj/Ib[}*(||&2"t@ef{`$ބH?y#_"I->A^+%eEϡx6,uC^iH!9s!9漄i$dERTS3j2{il2mq#^ -\d;/U&7VU]k),dDJw-|܄1*t o,` yh@ Nʧp.;Q zS_wm{'ɧiI?\T2i@J`' TAJI$1|H)=bBߩS=&4%5=&u<^x34o^x_q~O!8}BlY@&RR/ٙu< <"]JJAD ϊ*RmGJjs` uywYp,3;v=hd 3φ]A鴠VzЮXelA q怗F'&@PF+pz2y g]qeӉR}-M1|;`xx9I҂.>5# ڕ}Ae;pRO#xHϨ5w xak" ~ҩDMⷲI$Α$/֙$FT-K^ .k$Zod3 jch0s|jh|Jxv<$~ޒk8Che̟O=^4Sê~QMaPMcTvΈ ڈ&uŷ)$1 xe'4iu|z"2T !$y)`Ҫ8@Hb׊Ot1,rR ; v gÖ[0wg5gh"" F!L>g$'c@(E!zٰ|9<𐚊&pJp7WTyzvc֭[|Og]1Gz÷ UVvz-)+r<7$=H 3|!^н{0&m3'?(pcՔ> Ҍݔ.ԮRL,N|A4q ڒLF)oZb|%'_Z|IU_^e[p%Zrk^Yhm&BHm- a퇹|yFAAPq> /:^~j cI9}Hweg.ʣt,2"c֊*,zH-TάNȬ++  /H!M$ok"I]I Enx8C|e.HV ]?$qQIIH qF5BXy`;G̮z|}nnbņ P`7RlP 2 kF)Qb>q *HE`<&?i2o/6܎qY6xwb=@z|NUUxS]J(5u_A#?ɓYoCZ@bS)ƻekaM(H8; FJ8wn᧟^e6qDj}ˎ=l@3qbIz6l "=B^c QH2cӀ*+{r_Eމ"#z=Ii!PBlbPD/TW8}[ ^86pD| hĒ;aeXeWQeశaa$GI]iE $ryH_G|Y}YKWAZA/^ d+ %ږ4OByl^-(/Z=<4&ؘhlHP5HGF7ȈۀX[yjw KJLo~d+DZs[ol0 _<S9`B'D;dTHTax6l"= $̎HP Ht&7 6lӦQ555[KcogVXጮVUWK-nrheqoX D^`E%ٺ@Cޱ Uq0 g{dis(="^GJDj=4rПLC[ G#^bˆ(6R-KJm |MJ! $a$KUeZ^)ф$M Lm vMz|csv_x>-H.RO(98(o:/@2~[5p\GpYl},&݊H;ճ!:Zٰzn$AgL|>7YMo&""Þbېgõ6mgCCu}*ٰg*27lsFen3 t@vS=b8u {9~>H]) uWSmV "c=i 5͂#Tj ]pzp=$02#!}:vClee: r $@Rԁ2l%R$\rS;K//'cwQl`)[$]ËHns\vئ 96gL}?O,N'EHJ <5ByKzowJu6i+xsCH4yUjN4JYY-P!rj@B6v A\T;Tf{yCT2IMݐ gY|PSp֣GkPbC#"gᦑAAA-=Щe2LQ%kJ8c3ؐ }xG#,|q(6qR# nU bBmcÒr'*6 "'{,6@@e("PbGU;tIE $#BG|zG1Cm |$7{PfK!X)S;ZZR-mQ(-h<$Uz6AՎKI $_kZ ^ m28)lAɋOL T:M¶H֤߱UP'&A_{qI72ikE HB4- 3 !m :wYm ޳Avi{e@BBYZgɠ >/H@IlP¨g>jt]‡DHs ZHS4I?iձgC+tXV76j;H|(9[~Pݤ6K$Fz6(,T1NqFZ|ʼNE[ C_'ox޳A(`4(؆OSuZiSHhpH1>@ /{|1X &q .lIvWDRsm=ZUWK"rHdnzccbUH/}kc>\7=_l G3DVx &3Gd C6^zė@nO%dcp;}$Y $<@{0nJMsW5WNϋ/<ύ>'"A%NȺ)nj]97jnv.nf7Ze7jN_Z`ŠANmV_W޳A4" am%lp[:uR0ًx`ycyTNk5wjC;Lav ~$/ƽm3!ϮQ' sqv$~m7Oh fOF'c|]( Թde,l6hQ2x6djJoD,l0C\y6oRYnTO6k@{JxlskG"Q RQh련^uNTڰti mN_򧌳, N8]XfJqc}hvu,ƎlasS*c\#~RT/Ps+Mf V%kt^g8l  #hhM;ߤo̳a^ֺl[&{eˠw4փ|~<Dz'/ qlzl޹$@({I0A> Hګ:fA@/B fS.,=v|:;sѰ{惗xKg|]x!ٲF\D8 S"Z*OɴƉvYެMqYgl1LQ*He֊Dg$EDNn&t{gqɐh-Slx4f/ g؛ɚH~syu*,JSφHGƳ[z6A!ꈂE*e@:h2L%ٕ%H~Y)khqƪ m:{bɑ$)u "7Y :A\ HpKg#;;F)ɕIsu$\9޲ޜrv]Dl.?;/\< ڤ;F$ٰgٰhlGD톢FGn|:)7/m[?6r X"PrRHo%J"8"(YeHزر[F%lHn?y64)7ՌR|29Eц% =Dq mو窵o]4dv yԧV宷D oQ Fk(% \z Kx9$U# a(+@aˈDt,էlHS|]H1' J:/Hk9R sUfI&iԐ u{ C2ʕԄ+>:\MHJ5iBd 2φ1QZ*<ȘP|2Z\)(.]$yqۿo~L#g! $l"nݰ8$+ 0YC|ügdlfR7 FG)0&ռ @ φ|)}.Jz6/w<"mZ=1>^tQ! X[= >)Sj9H`'@jllhhl$ucm= "Oi@z Ww< ْ+\W==_r[.k$BG$ {'t* YI-HMCj-INlj{9n x݁EG* ցTsa"j l<$& _3≆ Wj+%G?r!?3x֦ %RZx^:! mA s-}spbaaOlX"[6m( nMy!,Vl8c#l@Rh5 kUSE*bd%˸CYzߒI)²jBH1x+irQ/Guk Gb,Kφu ++#Սrڵ\9 'YL!cCs/)*tի$u`Ы=H^ V]/NŚވHbb  y̒8~Uvn)bx &<6C+p U@"@zl$.Fsix]v`f,ǀyh$*pq4UQ,Vi r)$/lϸE_ ]}:GT/ ؟d\lXr w HKkpGhm 8y7PW#`YVH\VYYV\HV Q<V g@@o6""ƶmw+n anH~+&Vº¢F G'OڑS0cF<*&ܢyVM gU M IlLZz 8ebWg=)/bLc ʹ?ǰd9~oCoBHO5^MHuP9s&MTHCC\2ӢHܜ DA|kihh9ag\WSX*i}.sAg 8@ U1m z7 GH/|FťrχUHG2njm.~˖ T64N;'u(^ p,F_oAj'KSC&AK}VƄIЗj]N΁=ZUk @zݰg3R+= k¯~a^\Y^yŀՄU-җǴ=lFO: $U>Km<"!Dn\QLIZpO`Gwcn޼cw8@K_ܹwM7ڲV݋{6mߊ8u3i?ft8enЀnxADSxJ yd&Itl_&1:s{,z#Z/d&6{IUѤˉݯ&Yž;^kA 5Skۗ]۷CIeMh)0T_KA@nx|jp80?@__n~W(,т6@ 99A9۩ "ps=w^7pa1>`Y!ҳasyVCqf#81^o=23 \y6^ g{lXTV/R2#u~\$Ir!osnF3@ZbG<9ӛ7O]RlhfU :pElx5@zkjR|=33/l[du܏d[M$uOnr5IS׏cX+7 G3 uPA~lj}sffs};~xJu`o3gFHb]f6˓\uXٱ̙W!Atfw݂{H_$CN8>\Xq"#RZbASf-Hʬ29HK1@ C?J3LP>xѧUĐrpPTo0w ”2pє›gC³Aj{BKU (bHy:h323֬ 3,˚-\ܪ&:pJ D@ =")֫nB J@*)AH*9fQv\p'8+>v~ y8kקwկxBV,\XvaplK}ɬz=ѮIy縿|@WzC ǯy̙԰l੝IEZY_[ B HF8HA^҅Õ]-lG!r"&U$gTh(c tZZlҀ4gjtbRP ņbwmf->bT%Sj 5ATl; MLP,l}*x&Yl0p^wXl.^._G d;ŋ CTaԈ܎XXw/@83#&\e\itS!.D{e/[=Qۘ\ɑ`Gs9jpRپH0 $~6Glm̻jj@ڏñRzh / vksr0ARFzB QƑ* CΨ C@Kަ~ɇ ۡM  ߘO; }]ȶ;EuEcq< /&;> 2+ vry"Iξ&ѻI]ϢK "˨muM2^6VBw0Uz}v~$~BMpFz6 m?Y[Z<-0|)0?HYq$Y*Eg8)>}j?%y6_N҈(THg:^"d R6uJ@z!ƀ~`C"?>9Ev"dLze(Ṏ3HjER;z_ PCN"d|(!h;?M0n$kv:LĮl` H|9Ӭ U[Ql,tKPL Ŷ gI6EijXQ14GH|͋ rv'Tu;óijd~A$ 95g= r:EHU RIOTkUG$zseD I4qRjx IxIɲ V*[0Cy4@ǵo?ζ!/h H)2 =%5؂iB El&m^g ]Bqӳg >F`l&b8&sS}B$aIl}[eKVs}۶ D<>[ed=OZ{o"-K8&q'\z6h}:l_ۙg ϋw.Gwd}M2Ϊy^0[ͭ3 dVf(Ɖί'onfn\L'6:7LM?nx:5Hк%KgÑ!)rwSN^$kü%+_m7! `oy"lQ+_ >zf:ylwzt zOǞ .q[Ap@يO;r`|96&u;M2rjd9}]}:%}0)O_Ǣ\=w.O[mF*Z|?}j'lC 2i8Ch+ZunSR5lsk.J(( #ζ{Pp>e##)b҄kZזDXP]{E鑋F]ɕgCڗPr٠]c2$@Elw5O2j8b`rMPM7$ 2Uܼʨzv`Q1FߩxڟW]cLMcc9+6ȑ~@IsXF8ОdРObLއqΣ);WHA q*?1a(q+CyeiCKڵkCӌ6+ky) xc O>9:LV߱}O>._JW/Z4vEQVvm68l0b(prClE u:4,D Hwxv}ά;A>'zZ)KS]e%lȅQv'$zKXterg~տbHh?QdBLuHz1BM! )&|)r )azZaF$~OS;^M ́Wqr Ai(@k蕲*-xFV~2J_c9}k4&vW 8Ǽ}a4~g;˧M78,FshQc&;kȳAʚޅAu['c6%*F|0ұ=|2K>๸I| L7EJ,թ>C?CwKRSq|vBJ6dD׉?_h?ՎKgclTl9NR %$Э,hm}1H>S{oX f7f!u_OL4"![ E^@"HSXJ%Hc H2$TT182v^\lB9^xD 939Zφg]f!hO}t܁8όqo~Jj1B D˫8k/MY!5 A}ɟӪ|!\dup_: ܟAB]ez|Js,?$U+) =~SsqRKH0b<+ӛ@:L$-QU9DL!QB_Z!i z|w8tI?%98{OݕXZ;{NvG/룷Tf0U20MF\.kyr_e, iƆrpwo0)#0Dv0}m I$ʰ9@{Hu1edH\aОRv~_ `:Xv^ k|&D 焑w30lh{-I>18?&ӗ.WAkυd% {I)a!OJ$*f{ev+A& If$gR}d}9 h_؏pi{`HBc%= t7#"e$@j,) ۃYv. ºV$$H1\z㧿R$)z-1=+%AreLjRXnT[K& ޤP%_Py&3ѣwsy,x d~Xğ/#DkTxQ}G[i?%49ۻ>2lAX_u>f%v(VB#>CɸnQQɮЀg_~v-iԈm_!;. c%$ऌX`4,,-]*-]ȦeNiC'4n>-o?{o]'+ _N SHa}I Ip(ɳ b_WR3 =mja/_rv гB_Ӕ!tYpS,r5B4ņp_r|'Jt88T%j*˓HI[$rm˳zP:R65[%H}"yxl@n*KYVT`T!|*|:h=|h< ]ܾ<$UZs_RS>jrKS[G~º%$жZwhX7 6Ł#m{#QM3$|=G;%6%G#/ ' V贄⶯ږn~ugt$%'_<أO~gHf՜ .zx3ښsn!y5$q0kVšeg=OblݸX~8 %NHXb5"k@*GE%{.aGHl(t Ϝφ3Ix6tl=HQ bS g8Iݡ9Sz/} UQ˷N k$Z/'kspXX­]ж1IiƊJDcz(/LA0QKpe yLXނ<9o֑'{r/Əy0"ٺ R c VO&dtRlKOͮH#jj~PȎSu)<.eHW7lz;AD_6%p;?+9ZQpg au csQgЫCH>$mПQѣHgS$BFLiYosĉCoXARk8фD {ׯdegyv UxxznXfMKldRO/"5ܩCqHz+yqKy)}@ 60՛4 WUU H @ʬ%T(;8:F^:~/ ̝QI RkABW w 8r }K͈qdG!VcHC#Tw`d\؁/M y4qXY?3c.[_jGe5i9d,mLxo sE СpWt1O`eUXPS$=EdH"Zfyy{= 񪝏F=9Hw95P{R14 z63g2f➁~p3 |$(iR;˽UǗSGôfIqj5' Uj.)Ljjv-}ӻ=ieՑԢKjjsZ-|djXӝ;.S\8\vCL3nlg>6${"۷ywf`Xp׌_+"ƅ>@zgO ;,bяR^g6HbP}c4]-wzegˏ, Y5VlۋNrn%! IR9VqU H/J{V-BjW;{mtɇv| PA @B G芷ڱRV{wm8)6ׂ>|(6p"&i P+6x#cѨ,yQsdx.6$^kSu(y-8JhpVl0UW_$9{.PZNjG?(cJlͦ:z&DD7_z;sA$'eVJOTf9ռ"%'-ɸ6;[z6dgS.5fB@9PϯlD]qGC= $C}{\ pXj穕Diaݝ/6tn9lc*5pfq-YlՔ=6!MbfN0:*Ukcڏk-)2s- \|/WS^u*YfI[`n-j){P#^o^۫@luW "U p+C^,ug>޶!Nlh6w6f:W #~^ W:?lHYTuQTA:?HL5 ( C Tm7D 9l;̙ʓSWw;,%9Ԋگ d@9&k|$g0}Y77U|PU-nf@v*Y)TYldH.L0Ae{dR}Bv}=H"~и?JA &d9.ƌ]n2xz?YnݺyrBnonE'6˜Ն"ց<;N,wĽ'kl^4Chݚ qIL&~U>;"A H2$1< ˈtZ"> wq}^?dH$Ǟ {H$ +5#4!> hwm9zפ/>!gKXb:U# z1O*SMkz|jV̟N+)ֻ]9ՖTB2(`HybPDY'Έy:9QL\%#ϦG;"s'ow9-tЋ!?p4֠Sy7oλs^V<^[dl=w. EgչjwW=mVAPcBN*$**"d\M5u@ZE~ k@rٰ74|"(Ișr"$ArcҪ Y.+٤Ud&RMsݞ*%5iUAINZi~>fkvjgÇv5iUWMG HGx&8z/9=x84Dg))7~tGGolg)<)'FMZ֯ ~(zqlhCo^ÞMt-Q VlT~@&<0>~$. H2$${I}|@ z^#?1iz6䁠:[\&΍6 '>S:Wmw5j_6 ?F!(rD\uVE%_O&Gk\n zZ.׼wF;{7"_^(z:ll ׽b@r/±]ڗk5p\.A`zQl #ɞ#Fb[}rooEo?qc< 7K8Fƾ<'}iYӮWvGK3pf(-]Jvƾ6Hp>JγAҟC`,_9i]Sa-RQc NE6}o5nۭ8oܵgu^ k_oHpμN?$hы,Ȼռ[OoIzφ0J.@p;A n+᫳IA0@ seBAak87qose(#Oi'f?[mrM=޳aG0i{6z`@!_AMP.`x6DlzJx=³F$ ];Q޶>y¢ ufO%NTݕ4Im#>KzJREϦŒǗ~)ڟcne)w͡řLx^1+1;g-ƚ#в#:54xңjc„Tubp}T[#@`,Mx6`=lH䵛8җ{6|AKw?;ȺUW2O{mqlx lG{6VvZL$Q+A_8 uh(n27.6%%CCGy|kD[vgVB*n`?mHKZo͙&ĨҠ <ݒ8@>P: ߀tr`Kq gWmd 8gTek>>/Rg_=n 6+Ǣ"<`I\I} @E9/6ؾYOczhl׆/zS φHGֳH"dKwfn],Ȑ4@ pX^H$u^#1 MK )&LH_(2Y%;Y-àyky|x"g yp6g_ \Tg&H("( *A,?I A Qc %MD FibƸDi5%IUM۴ (SP6*KF4νf$ӴɃs;bS3gފqI$I04JtX}@m4DY%B:1- nsBMLWzzxFjL Qm)8H6"=b[@h%]pRV)jYiog2 {ҳ# iU H ~} QQ2 Wm#ґXOt/ynH2$cDyTjKk Sb`OCӑeoc+7Zz}#tf<¦;g? 4I}x3G2)#G$Ue艹58},NKkgV_?ߏ@@B47)R~35i1ұ[mfLv ISbXDG@F͘۸1ΦÇ/+Fc;9ETt`leOTgcXZ!K:̒/vS2nM =74I[yVO! yk=ǽBz6 ˩gHⷔ%)/C<:?|,?pn|@]$RwEEP ՏQ8 -Fw031 [m`ۭYE$DEufx=͠/`Ic~K/e-D@¤_gGuvV['B靭x՞, 8+LJܧ>V'>NW~ޥ4.O'WmuDŋI;OA[Յ7q]U] GŀN!Iݞy6fWv{/~ ðy0INl=!c<.7y.%fj҈Kܴ9씏-Iab;Qk<8Hٝ8`؍B1w8;9nU~Y~v  - lb$DF{zAfNʭ5ta3 Gm-< ϸWÀݦ"a`bͲnflO "Du!Rh$IGceH!H>=o3}1?%ܹ-x O,)LZyv Gi@jl4wvw{9Hg3.HG>OZ$<%Ja-MònhC@SS_$!#)#]B@n rӷ1n8}C9m*l\em4ڳ53s,8;׹Jo]>Ko>HX=4K;t<8q$S4ymx@sXj}5Hvprtڵ(},R;I,˿#I``/Pc#A9gQ6-]^_luUVOK:v 7fTw|}Ԏjl (\K5ms&"BzPn8XbV Ȭ|hrQjVۃj[f ܎ zhADq9ik+di՟R;k.dņ lAԎ $W Zk}[3(6<k4+6.Ν3k>GUņ7l8zɑP4ls*+ņzYl$THpDT9/6xj SlIʎ;ţ?*HQUYDW_}{b l5  $3=BT9$Г< Mʪ2?fTWj@ݖ&)Ҳ[O='Hœ3?<^lI:V_x6Լ>!$niU Dd$ ߣ3ԃ@ aKV`A$KrlAfNj 1C@{6y!-e\*6ߵi2+-D 5$YeH0Q6+PVV^ot./%9^jw-GŠq#5CRR Q$u"[]Qyy_Q~/R{!iAiBGGU 'DG?>R Wg_et+9QB@1!龮z\ŲPFj5ޜ[%{o[n/NPLGijPCܼVc5Vw:Rٰ#]6sƗ ܆rbP- e{-U˖]`) UKF' aYYuuw6K@5cj2jۂ&d[A]YUEձQ8^7>{(c:E_AH.G=%䂬$IW_߷],dPr ^Ft IHUDn'AZ ) |>V9ޱ58ӵf]vO8ͪ$<'?D}tf M;2hgApcյd7{/²%Yy/Ձ^-ӄsIx6Ը?AS9l#bwD'Yg̘rLdKTuzt`od!R]h,= gvb3KczUAe+V;+w^ųC#/%bۣVEz׶ b5‚/wKSnƠ "#^ ӽz6p~fL^bk*ZDViA:Mzy<9uٴkMhU9:M H9 KM Vy$Ixqj 6&-D1?MӪI$%GS|ɪΪ~k_oJ{zݦUR=<[*^!(z B{_yv p㫕g¥LY9 H|AV2ʟKE$` QDm !<-BVMU1F &cB\@O )!(l 1@^ c$'IcN(BO>9T%Ia4V`8H Q!SE+!c0,Sɷ-u9 *>fTL&T69Phhg q蹇u!gvq>JuďA/&]r)i-nQ#@){ij>xAr-XZ_Q.a6TK,Iz7:TUΊ  3_=.k$0"ǂ,rpZAC{ҿ۱q#kCǻUi gg33 Lm CsPlE;i 1*H=5QOIܑmBMb;غgK#證~uF Apoŗ<F$h|hwG@QO˂7zAI Em W@ـC֞ YҳUg%G'0c.8!#3^~׌}p%GQv\+d&-("I"Iz6P\,\ؽ ueh#N^dGR=II$S=H$GoHGRvfC]Su(Xa{9;/x1XVѮZa4HTK1i<eЁiJ|hQ[HxhH<֞9s ն3~H\4Pu'l {=XIJs04/6d~Zz1Z}m-g&ujCwW=ooO}Le>#'<'2=^}t7{-%GbU -edDWRz']E,­Y}ITvx-?&F2cwC-' 9HfI=$A58siYnn$HW C(NzW~W"4E HG-OZZ# sռ# nkz<8Hi *H^侐t$DCɮg^RTT<:4D1 9mDJ/ 1k0RmA b#<q2oZ\{T<dj4Y C0 J1y/ ‹޻^v9j" PoWW2s$3-Vj@`U<_> A-m{F mH?Zl/aY; fH;ZJGsH[Ȉ@KK9Iћ'#y%Bjg% $ GBlZȂHݟ 1yz|^L$p H̓׭ N_4ywqFM--KOgkK|kSɄEC e¾gVc qgَDU̳!1J gQNuq%4uW$H 3[ϖj@&!'<^aሬYp-=$ KH"?.1)a>B4 ~ 6aS x=McH\îN@))UVgXF$zwmAbhw6_GYcVdj/T~ IAxq׌I{#{>VI5q7dD!It|$@RR I/ۂRxҾE~q D#iχMzTSbvl g z͓n{ >)O=Z]3ee@߮7rƎd_k##RP9>3-]LKDHZ$`x lˣTRX5 H)MC1fw:j`|橴b9vMūyaFA SƄ#fEel 9ϖ#ML c/FWۡ( E55%P1dx#W3 Q foVpgpBP^#I+#xlY$9HsW!F(K&`d\M[hdjG ECFS;Uu~DH K7]o36Üގt)w~.O _=NjOU$CRi؀A2w"z1x4s52?m_|U鄤o_zKS/2hC#i`&rU Cgȫ̙r-;;6³x6egam\F$]6~rlE(#Ҝ!HX~  2;Br:;ۢsCTφk<$e/XUׂ\pmdhUV:$~U+68[w5 uR dD"mϪ@5j D-Y8UQ Fܳ\%IρnR8G2t Iz W4wP"q>`j'ڈ$oGsN3dAdwb0¨GIrҥ ۹AnǦ/Nwν3''Ya98x ws:6z[)ugNO^7Y#uXB DFJgC%'A MjP^Z4 gn,vb%֓B1Y-H9|tN1#Nv&D=EJ=`iT$AbhM&E99U|D$ų9wـMbW).MA*3 ɬ&I&Mt}Hr Ք,R$=HÊ0-HW r t%t 5 AY(A\ Ҳp%ADh"`ICaj&~?#VmokZ #bbؘWWUGViPcǀ--MUomZh#qty`S4˻4]hK/tdӑa vNF7HgUG ndKK42(L>sQc$G$ 4a.wHN.SThH&+ɞg8!pQr] ']iqIL-q Gr_'3E_ ҂gDǩԎmjiS;꒝@rXc7'\6 Uw`m&GW~zBUF<}̈}vPhu__y~H4]%)oډ/D{kɸZz6TW:wnտ!"'qM!G$pt$?Y|Dņj8c iH̳FJyCx6x޳A `' `(}A4S+fTEͮF{ 8(K,mSdUD{uќ,븪)0Dw!F& IA׹[M ᇲzS V#PcyHߓH[L~SHJ.W)j +Z*p$UA:/:XGT=j::̇g@oH9gܑo)Y~0a-vA2bU(&Ve x6"X /跣MZl{D#. 2"-N@21 dthA֬]-@1 ɬ.ްY Y]^ |(!dsR@8ǐ'J DLj禂ݻ $L#^jkq0'Yú  VRdw~ԂTqggÙbAO=wqvرOD]Ԫq$Y)YG@ 7` A(6H<b tr/p_@gwA՟ФItohr4Å!w[Wk-BEҴtB!=hB.yp09~c9H6 1/lMMp$R;ܣ#VKK GD=5iJ!C սPuCCnV =$|X;^,LJT!ų!pT!  XG:Qo2>x̺EڠkE($kӸ!=F̘tNBˢ'pnh MxLrDL:oZDӪ;a7s+6ʈ{^"q* }>n`$dz$N0 ^=%A#F <#u,zCtK$‘U `]V)?VCtE蟬mVcǭ( =0ķHvR5JxVGܾ$lPgdk'Ua# li攂4ҘiUl0Fa`c1 F+c$gc ITIЧ9HOZ[m /1bK1p=%׭榓1G@a(F$ HWv\ޱ2}gwZس:=fwb9H)ijA]8 Đ6M3J1 98AZmwΥ>w{]sa)>t `Ӻ6ۂIt:h<sy{87GRGdD{fgf0?)gWPw0B݈up?Co2|Ýy6 FZ;ٰ k}ɿNOM ꣄-Ñz'Hrz6x(;`"G F.Bs59"{.GE*+JBD[V }.{_{q3Td .vnuzWY1v\ۼ23ݼljav9(PAG4b?9Y2*+.~`g]w⼃8z:6I<yg}mPGgC.9R"M%%z2qBXa7٠^/7\s'iИ1>)F{mbDӚn4ZWTc VMWRC}3JR8kQ9 4bIȃ#'S}q{^^Lq?E6&0'6:=վg8 $Q':L*Ֆ< Կ oQKs!]6~ M zt]\,2OGrKZφ 6 @$!XX*k&U',YIρ9=f|IZ Hj8R֩,>aF(k<ߟ߬j5ghwV#ilFOB~OYIHnSZkFc~ud&{8 ߌF(h"ImCNZ}f|{`_og]۳`kv}tuI=) 1.RAqE椣U$}HZ?,*9//9rB* _@&Gv=@H䜃r2R|. IClihEA"@`]du\voVnz6#(ꦵgáG ]Ikӏo/^/^O(y1IH˷:i#||RaZqyO$[UvU-ªc/=QRԻ{):!HKl}IaX)7[sr[P%]|ۤIcck||{qzTW)51_Oi޻qEHjکB$pB#B3B/+|Eĉo3]Yx~kuw"3;IbѭF[R++S*A0rKUU厼+gпmG@=Cz6$~qa7ATl5Yv&?pn|)2a‡y P6$|L# a+"Vt\I yFݪ(3x6hAB]wQ0< pCX(ȑ'GCQ"2zk6괰0T|"zmnaW͜RY:ujp6m/.ޱYUh~):?`p@j.-j,ʖ٥kൕ?F?O$ ӆ(-8ta,6H0><s`>BR+c> )N1xq<,6 $I$I1nq4~^"v;,iyP`ZَJqlDFOT1ckϳmbh{x 97d͌($PiMxFFڙhH>U=,Rm$;㎍扞psyclgƳ³AX i &uQ-E#(x R5ǧt_&cxtEcWCV}BےBRExIĤU8μ7-gYǞ?12;&{GGRgu`$zر7ئ_'>.^]dWO|mրєҾ՞16u2 0Q·21?~cPĨyF'E3ex6T<t } ifZ%K^:V{ؿot.הV,hn֋wotsm R44 5< uY4h +gܛ*HCy/8w}$mb g tw5zʹ5. ZO.ɮINҏ H/ETG W>g] ~'ΑT>Tjr8*m# H-+bCTYYATc&"ۀ@Ykng+ېOK#_|eلsBQ@_K+d  $1Oy) $R$f=pGlk#"=ɏZDnԘz`G)s= ؋#͎R;#3DrZ!' +́Bِ7KeRWvH/.:UKH% Rv8NJ<=? }D.paOl,hъbC-Ja S7!G"V/V~?-׹HHn dذq؍_YlY]$MW+ H`~VVk?tub}E!FPZn*7WvĖ$28q`jqA}BҪOM*_V^pO$Hl6HsĨeȦnFMo>2 !$pwGUWl LKi@))CQl$#Yl!O^`'g Y<!ɾgS6y^-6!!\h7Ҋ~(ߒ#n0RM߇w?Eyꐓ'LkZjDoS]=wA^F$_XkUfaR:mJ0Y0jasOi7UݻOahIռ@I, BщO 8ö^v"Ӫzv;{2%$ɚCKl@ZϱzBS6 ƾ ,J"ҹs#DzdHQ$#Q֝ $plh~8l+JFdv=<}JyvXRk_GRl-Hd!Ԫ?Cgm)&rAK.ȊzY l Z.69\^!IдU q:lKLzڳt­[_xЃ^$=G/?`oA"+ϟ*2=l'݄鐛 HKXב\]s6ڀ `HG) d#5 'HArm.$2φ-BeV }̳Pl aY$B~65i)o1/"dxG$Zk-BY߾؟]杠%i9-B$TT[[ H8|1pEH Qj0bu|1a]ˋ(bː" -Vfm^?j#O<}\NH>E2@ZQ1@FQՏlA»ۗx6KnP:mB 'HRhS:+DЗ#g]:&^Ur"MK%E4B*RY-Hy6Mf NQŧW~w~1ٴ ޴*Apv|1pi51IeIXTӳ,6-d[m$H3 }*rϗm$A OxUDo`_8H6iٴFv%]Gխ/5˵1Hsax{%IoF3YD#m2/Sҋ{y=qn}H4)ٽ1v(DvҜ{{kyݶOgۛ^fK+;`ݱ2n "{6|1 )+}7TWyi(1 kpl׮ڒV% ު&0`=<YhOp8| 1A m\O݉م[_޺eR@'2DǬ~OڮjnQQFG͝)lFj$߯Z>757lu_1wjAdȠ5$Śx¤jiv6#h6t7vFC 1۪ "ycx69b?Dg"qCA?֟8j^PuKbds{ϴi6ّo &Ūo腶k!>sM=]TvggtIg×U(Ȉ,ƿz޷'kl25o#F @CT@:/G;7=֨gXЧ:{fcq:S1~?OL MjG㜧Xw3"(+=?ޛSP9ӧ0Ƿf[W'mᇁ65H-Q-JKIÍ4O߿3$GD6ά ^{p06K*gwK"V+#9ZM#H0Gl"3}EZIW+dqxW#?x㟇ws7mƉ,T(zG-6`͚q_ ƏB@TmysczF]%7``i 3츘ի]~F۔/{?p^?Q/+N6{G)p}&͇ϟ>yCgTV|3ݾ_3iۈTpD$W<0LGjJK H)%3;>h Ēmx!&=H.ΝcB@ TMXcR_A|]N)h=& X8 ,kkcQ^ ռ <5h>[)}235kRJF8zK)dfe,em$V}+bG1> CwuUO$H ]ڛ]ݘ ٧zm~?!iZ4ay=b {p/-H9Zӛ8 F?P/9JB ` $q{Ec4绥k< z۝O\`i{6#&D ACMtД֞ﴦhBV=HCAwqޅ$84Ipb-:7k^eFhvDCH7TH]਻[mvm1@X4ɓQo@kՠ>@t26M-иyr MCDBδURbdT;ٌ:cŽ8*b 8Z9Kc,)ZA"_۳h;4?|Y@Xڣ")ۃzr1 BI$GhZ:@xb8R< +i\Ce??Ue=I$s-HSb`#0lh?=L0!#y2ϫc q{IR)'qVBONE#x~W-娟g? ?p 8Iҟ$u?=<L.D}Kx-}B+ÏeqUIGObwQX<20ei{=tԔ NbU;lOУṋb2O~D'_ uMONl'o/gkӉlj.'Ǘ_߳ᕛ7{2<CH̟! SӢSrSZ"}}#1S#mGܱIG>VP`5ՂQ.A y`GP/иѯUA$G;i4E#7 QmۦM^Bn~fT<\՞ eɾ&G EG&mٔJϑBk]}O9$I0^(,H+kPic̋$oq _8ssO+A"偤Y@rR>N6@j۞ҒPU J쁴 PT< y_qw- Z|˄R>-Fu!((9vROk*5MyZ>J><$|$y}d{'QrRPjPSDW!m4I8I`-Hr?klLTD$y E(|?oj =7{/CvwJEt)Α!7p£өUT$7TVM 9Hrr pͲq8x+ ZJ(%!"͜ovW",u@n&kiӦv>ۇ ۞v?[R^jGayI$%_娟~U)(?5 %%]@T oKO 7}?~͕q= jW iApto9:c w򽓌V%vTK.ol\(DXυ@mI񠊧Ge[uh-GPrr`P"4 tFG7yNT*6dCTm֩W1fw\g, rq@GTvu}ö?GXlSdj/IjJ莦ؐwJbH&eXn1ۿ(6!; ~^ ԢCbCҰ l|\D/v/gΌX:EJzJ(:h]So Pkdv](Θ ~+aڊ+?}a`,GtCdusYU2Z|"R\h\Zr~mX$b]b}F-Rz=UejMѥZ S/$ :ٰsHjnU$7|̛9Ir;.6=E1E h[O代W|?|D`+Bdvؐ)`JluPlpX~pD|OB+9R PrPeRv?HܞYl$^|.(.<>sgmmΙNv7y𚥤 I=E8N֥Q \$@ 2 ")2(0WөCh޽p*l^) yFHXOxrѦ9򧋿7mvKyc8, V AݲZ5Hφo<8".8!*dwk{KEU %@kH#'knjcn]DU8Hruou}Aef)z4L;w/;Xc6 EP4X8  u6/_X?F` Ä,"'NX]e .| >wa><,69,Ugm3v\ՕWF-@`j $ !$Γ( K9l@ٕ$%x)kjmRD$!9^ο,US]PMXhD@ ց$5 OѓЏrܓ?KM88HM*GhtR# T) P@xL3(s$ ӼK/:lcRBc>׮1l!qZ&Ѐ$^"]XgeIxT ͷp5;! Y]Wz~+tH mfm[4͖$$ȋwY? >5 HU8"ԪԽqU-BnqFfn,qV'IqD V ggi<6hN;͵YkוvTU /s=7IV#ML _s}bw塍bc8N-Gp@H$94Xzo*p{oTDynȚ]^U{O),k`ڵFǚUR=UJB~φM槦>ش)N @JQ_ɱ]Ow aݴh8"=[!ߞFyl7雙+}ƍJyv6_Cg߅ g<7 fDQ'i `M?@n-}Jc~ƾY|rwODo~`mX5<ֳ!d7 %&tdӝ`S :+ROa'n{[ 5IZjI H`اo5׷ZoI%w{Ϟ^{[ͥ|zΝK?R/@G.^(@|}VޟjwH?8kUCg9nBhU٭gx\XnPTH[UsEZmSGmiX+"\>!$bAp zMJګ?w'@ro~"@7X _LtE7S#VNҫe>@:kSϞ>E K˴0xPh. lP#e.P4 A.RYhٰ*.nsO7,xPXP..SxyƇ+aw%Y0Y{`[M: ?}h%>]f5W,={fK ^p%H=OmɜdOʔ8@}uN_ &Jײ0| U,7-Sy8A+~h r L<:$WJK$,`]ݧc0SZ񤗼?j[CG2mz`G9G[eBz(n>ηCk$%I\ W^QO$5auEgG?CL#HQ\pIrN*B$_[?螃7rFAj2ѧnr7U#˃/!hו(j6uyzHW9uL'a5Lg‹K\\#"rGc}sI >7ug1E icwׁ1 YV?7`i4[6~]pkpg q -~e1W0q鐷$?ѯsy{SP;9꓌ss kꮧѮbqQ͏%k7mr:];g\HWI21}(4iABֿ34e"_v\3'> {Ϳzu'WyR! [f724,7対<M%H4qh-ՂD-,` +Z+4ݺ;.kc>a`8U:ODKх 4\:E9 k^fܸ O8.MM SoWz $= GľVmmF/FH;}d]H^7 La0 R#ɳ,5x6SW (c];7!iRވ[j!?dYKi<'wH<_K>IO u^^N$IY諫ǜj3UV(iiyHT>H^a cŒr \_3T%ˋjge8iƟa11}w_uvE,o+$>F$lk8=L+~6y~Ehׄ$e gP P!$/Pzz,9PcULP󞮠:XrDL"4pdR=孱sEmiHnt1$ ŕY%ϓ6PeLQ ԟnl4Jl@@*jTV]<]V7H#Y%n zThS׮ h^ӽ{ܳ6*&iCc 1#ˢU뻆՛՞ύ'|4$I u\==̯[5"Ⱆ )\ i> Q!&rm&6򕱍o䟹sqT%teK8OLi]Hqby7k4Wc$|%Epqkz @ PR?mҿ}`qI7Hbջw1PVS7$߳J5{=,Z6l!V1Dk8v8$:mX (3M`G8!'&TP5N~ƪNp$$מ _AB,8JL p?4=$33])*Q.}5Wʆ78 =dg=S=zZW/\ ?@*g$-d˞$FT>j$9 gG|9=5PvJOy~b 1W@zEl貏t 'Smذv㗏44I S|{SA.'t`ؿǧ,S8}|j{GZk%/O0i^5Zk$#RejDZ{jA"!/?/7 #'H3 $G &kd R!vnB~4#Eia/ BDcC$8NUյgC[Hl Y@WKv1/LJ.7b /P#k#\z^>NE u١XlC|y˗]I^|Q9I( YԫO]$IAyzkod<~}f }n{ԍ>CH\?@J%p|u :5glpH 8wΤ -knH8O, 1 R~5ڎl%^B3e4$(rI"q0-!.?|(8߂ٿR'~xn}E/ŝH؄GOp-ZNCCW` R/, ZcVvT^fT@B_)K ڳ+*fߺ5;{6tgثʡ*/H0󠕟#=թ'Α|ΑV8ioV>uS5˗/^|yGp$I9[틿^\N$X,.)`*VY #Ifgd>Uۻs Zki^N\I,*HX-݃Խ-{%`~k׭^;ֶ.m;qz"Az O H?HϠ A^)iNI*H>| zS7+)ONL`a-O;˾ӉK,*vu5;q=:qmm'2x ⅜CHCںV'hHNAk] O>rUi٤/=zQK}aevB³TT@*g\^v&">Wd AP9L?|} Ǝ5vEw O^#HPG=H\3u͸Ю^q#[/9J]Y9^-lh7\?t3Ao4vhw];MKcv6)kֆ% TZա݃3] [UWq-Dnuḅ_?x~3=@C[^1p_u/8_   OK%,eq.RD][TtmmcGn6Ɉ$?Y)~GUߌ ͏Xr)$tvID|+b>HFT< W!v$<xDC;?7 HbO2H IGlʨwi]qH/a6n i8 =1}[[fH)% BIjI&a0M@hTBuV zr$svRtó$=j`p"lX;<"Aҧ³!n2 I<@=5~~5o?{m]LIiirG\oh4 19R/YDNwz}f%W slpZ8 uL:"[&DfY7ۓ&-!_ #侱xĘ- b6ꤙft;Ju\ gH_tx;p|ohq8EʀJc L$X("j-ĉA3mPD1FΧ$ɑڽ׿v$Gʺ^=ϻ>-4>oORT A7H4"xtŋn=̳SUųSI's~^cjHUUcƸiHzZxeCR)ҧ&i.fmC - |L. YinVW;6R&d)"m !iz bOvԧ}y-Yԑ爛|Bd)6*F93пqo7Ü bB\_|eܱ惡ӷo(bv b=pDAE3ijʮ'Fu$92cIjן^f Hf^=T-}ݺU+A lHC:ä/:Il8]QqKz6PR&f R|U9sUHIChXۡ~v3A?꧟~"R@u8RSnfy*$ճeؓgY#AD}ѪS,mlBoΎd_-v`P=i.g•kȤp E<%n-ZφǞ<,`9$-.ZmGҒe[ݶQ$Hm_h *>K$GߛU{F51 m&UD$$hp10$4rLKrRB.o5i /q7jL.<8 I+IRS/1x6hIߙ\ɳ3MsR!8)^V&[=ז)(vzѳqCz=ngޟ˺ȴn(ѧ.;o}Oƒ0{A-֋D \{,fav72,wG3F}NHe׳ׁv!24f%uH<8z#X5pdl> |ߍ}wA·/(Hsj5_/m}}={6 ,)G+n=!AƊ]x'cEl:5PS'"Q8լKCg:-1b*C`h(8PɔM/) Oh`(=h#9&`{뵿-\eUtNR ǂ/Zn+/))=&L(=.n;ke tr pߗ/gy*7sK:U7Qq 4/ (  z`q pp$r>fkHLO5X z P:cA%Hx.,ᔲ) w(O lj`3饸hyGg;|79pg.3dHbj@EL ++c9eeTt #"h;V!uC@$vS6._Eznɥg__=Dr}pCR\v:]aӊ6~JR7}5Ro=.cg*E[j1=|6D] M_:̌kj Ϸ^[[MtZtz]#؄O֖%i䩪?8Zgġ\럤hW$kLonl.p/  Yz܀(c1:EFH!E]MmD@t.芅$9axP:TV69+krL~ >'Uj!GhL壏ޡQ9O Y#qEq@r.HDC;FY[TK{ogLwOÖ<5׬TG5h=C X yX'rB+WTKoŷYih=ʒj*Z2$!ƳG&hܺhH/21'8T<D=7=PIMq;SGde˺l_Y=4Y)}Aޢ\IQPJ٢)X&A%BN" zc`& ?1i&{q#\`tIFvVwcY4:?w $jćI?~t࣏h%Rs,x65 Wy1<r(G&gF\& XSona!2Sla p4w5 EtF҆l(!J=bY5dI\AeiAj,6S,3bTPd8*W Ex%$YfК-3,~ ^kHDR[fmC)\yQDE/3& _d9[S0ݳ7o>+wf4!ɴU4uj0شԯ[TϵƬ^CB0wЈU2gZA"gӕQpAx wNˋ~eM? #=._Kɧ\5@>Joe){V2GiPhs@;﷽oyĤ`_9"[hE  8zTN$PҳnKCiJi6 8J!)sd1Ȋ%n8J[/5;R|P U#ـV'φrH#;%H ɷW $;9U-7j0P>#"jŢXz;7wֶQh>裡sށN>KRC|$//%$C|=Mw>$Hɴ QaWBx k :PC |EJGJs5)qt [ ( (^?| zu f%7}NբA*&-\X}{(YRYL ؽ$._Ek;G] uNZHG౱GأceH KwHx6Bn+~ KX¹׈#t+N4sA$G5)S ZpZg&ig@y6d5n8&"1م/LNnj憞5e1[ʹm< Jm"ۉjf#[ϋOn}DHsO6=xtRt7$ I#BfD/>OgQLH @(K<{H V :@8|n_"_6h Y]Q ǣ1j1D'IYLdJ5TvE-Zri,8rҪPB Qo!z:㈶|gg>1 yo\A+78cSaQB)c:#eƈ#*XbC#ZZ--uҳW'φ\'Z ׮ gc;sxIJz I#) 'Gߧ:'ool(<=m̫ tkIz6(^U˿<􅌌Ԣ#R8.<$Mcpo畐MW߅J^TDj[<x\efΚLJXЖ`Ia7pv G)̐_4u#ω\8Crۭ+Uf"$mB"TR} B4Y*?,RЁ_b+_He>Kg*c/Fvl=|{t3F+1ʎ 3oYk($IĶ3ò0wL69H,"a$eMiɳo oңgp3'&'Y@9.$  ?'GbM+ $ R >48$5Ozn|?'ȭp H*HHJHJ)H҈ $qE[zE6uo|f$x AHX +2*L E!p%@1xp 4/*ɫs lR@d7iJYGQ,zDž鏍FPdk#ϗ >3 $i"㣾GVPhI yѣa$Q [F^X$d.5#)|4BTה:gNjSgɣg,f-H~Y.A܋ wBih.nuC;[CKʡkыvZqP4EHv5*':9cC[CIרZ2:5`@:) ןH#)!9 M$Ҧݪ #df,EeVNvNj"}rm|B4?|1>¼Exʑ:b-9z&4lwʏCϼ\(Lng9I *V|vkХK~V:b2+†k/9D$>F})sYÄlz∿ζti|N2+sNz6p\x6L0tM1gQ W$?;Yml(o'p+ 4 HdÎVE/I6=w?v#&[d$|HW3dVΘR=tc'5lE(\ɆNOUT*6a H6 (!yǓ Ppp@7$K#IH;ІDY%eQA)ͨ 5.jP+Q spZ"0 ?z:.z*K^[.tKߥ[Ja.܂35!@ai8X\Iу#}}lC*dCld,.ⴡzlpl8|nyA2Rհ0b)]+du!]`Y,KXzi$ Jz!]ECNF!)|'kcV,!})>?WVoLϷ(M !5LQ[H1ʍMιM!-Gt͍7$=>邔 Qw;^ $ųiu)BЩT! h$cUѪC $ߣ)cM2>ro֬{-X'@;hХ%s_4({ΒKop-SC7ezz4lKb&_:Wyg7M>@=٠³>u0hcVfqrV} F.CЄ,#u- Y%'d! 8!' , N&d%&d! Yv} `HLȊW}g$5xtyDMo]{]=Mrnʾ}P)3 {$oi-S o]v(D$*k`QFSr_{b]@c`w6M,@oϠ:ճa@g Yzp{F^Xlv9!CR";9e/DhT"iK$G:,cЋ!wC@&Fhum#H[M,\ThXzмz_ VKH I2q58HV Ү6ו\ \4St/WܨGj֭ĤC67!$0M}t:?v,Omy "$zl 6t$tRA#7%B],Ϯ> !޳sJطhˋCܖOd!ǢrhÂdâUE{pSiۢcw4:h2*rai7D@"-!ܹl sJ&iHo^C]F$ |(14K  "]YłXNQXYHJ7;$DI늿G4wi@w܃{ .x6 rhʊؽVE~qٺํB9DB8z#F8QRUcEEym@فĈ|pDR tnAz{uٷCkoêX/ qN FI=! '֮b1AH>Ԗdm@f ؑ ]'6 pDZ2pŊK KCXDiFA qdZ{={t()\y:Z+~}ycz'\-_w]ZdR a$PQ+r_498w5 4J'{0Kw`҄DΝ 7~ی5BӍbշp6ukOWi7oN 3XSD<{rq:6Lڈd pMW7f$?g$ͩR^epoY/86"=P|cGGH|qtk/I>ټ hCSܻe~0_?qy]v`#09\x .:V+$uxh[ۗDDj$/WЧO# |"ҴW*)H AQİc1j$bPߚX- ~+  6J$vxġ1(, {a*25peKVt!~8J?i4>xnr3vUln\ KK_U#\燇^>4(bA#.{+ZE'$cl$BTאݷCs?fWBlܵBR;^ ::j]R;$H]fM۷ˮ&N[\GK !8zQmƏ<$GgJkcx`NZfrK Y5]^O&D|OGL iR;'k2>wAR7u9LFVFPr'(H(ٰM2Wæld7l03rP8ZQ*QZGjIG:N8HGE( SП{?&MՑ]e:x;Ě? Frφl IG&K]6 ߪӐ"ޗq=So3UuVFq} @ HB" ahg'H+[|CY(0RIa0 SjJDB4!iXUCwp7ev aslUtзFa2sx)}3"78ږNJX(bi>CO=|Z #Eiho&o 7QaQD&$!ʑ]݃Ϛɱ] QO+Ig ҳrJ܁ʐ7,BEH#~ؤHG1N=FڅK뾵 ߲"+Qm@ˤ@:7f5@sY_ )gv{co*$\A>uV~+;٩'{XפB 4e UȯWƎfrWÍH^H:}dC'Wq'ٟ[$=M~tBo8r ?#A&;AT\; $Mb$S aG 7MR:GFEazqP}v (I`Mi%̵14]Zy"VMW#nuu-s A}FQv׮kv`|hg=--x`cIhd7ǯoՎ˺́ M6x" }w!I 1H6`$}Ɇ9H 3fRΑyg$ww28HIc܈"|ߔ%IO +R |"[n+IX]I#[Lʷ#dù-)MJZZn UWӈUGaXu`HNɆ״BBWEr$Ib$edC|9dC%~t 7UoKFgõOM rnAlS0$;ߵ4477Xe3HO:i$H@o.oH[.cxl 9ڴ侩R[H:K`YFWo[mNz"A3|CկSBT2B˗/O)-MY.n2rR GA"M޵B7LCUJO 76Gl@:"vH8|j®ɒ#X5I zAD1`ܩ2gמ sW[6Ҕ,}o/P7vs:t\{ 48)Ur$g7(:@wB,[09~^D1m( +T\mE+0.\:Vz6*Ƃ6:SSQ oMLA)bMF$>!+H" Yhݓ?: 붰DrBE{=Nj1|B֢F$鉰I]Nb4x 9~'߅$7#S~^P~@ƾR=pd۽} %vSe{c>d|DlBxHBD R>O)k;WHeo"Ў"(CN<y]|tg9Ha;;8Ae$;(ɴ^)ǟ PL!6k&d $"u n$ah^܃:P8HiPIҳb_(Q/NӖjRx9+%BKv:C["]? Dh2!.JᏓ%B2")r:ntS"긫!7>tGR" (_+B3-:j@ڈ /Yb@k˾` ;ߗ[ZALBQwߧ?WEn1].O$[>DeU;ÿ5W=EqXTj+e ?N$Glb;hNN{Yk 'pR {mXkSѪioa?Ee ;E/mQ=sޛ , BV!hRѥb{IݝVgO }ceΝjNG֐.m (;mx"+Omzo}(o8m% y>7joJSuC{ʕ+qjSD)) s9Hr$))fgҧM=b%yי5H~8-~ G|2IZ^GՂP#);""q`^<k{'h.]b[e9Imكg#GzN[۔}+`d&gcvL~osonGD£œ7`/4x@{.Ac6xsԛH{G3ϼ?V%swɂĝbA2"z߭5l2`lKXHs}N~SCلDBqh?q0E9L ="->j3[ u4IBfg?6GY5|!8 jF@ҳ[מ X{Z'5弓Wej=,HƿTSܪ\FMK=y6liFV;!sV0pM;|Or7p+ ڙuC1ׁ--7n|<3U?~(-YCiʪHHO X8~ xyXcl[YyU寯FT#@zɃgܾKO?ߟe܎L~Y6#/UrG Q"F8z##/86@$FjZ[Z^s8/p/Hėk>y?K=8Ғ2mz@W)vw fs:ŋ'k>+pp=H[?(:/.(.Z]|g~J9NIMo%&j1_'0rRs-YؚՉ=>RwU;՘fqƌFf7֠E}gVXI٠1~q̭gV˶.ۺUWTob %),sx0ȎCUo~޽*N0 z=GP00¿pA$(WR<@pQJ[?{{65E z}&~EL4?m$TXxʕ%B 9̀[%Xp1VŁ`OK[Q8A O}-F>Tr\ɑlR/hv((YF, @$ݡː\{6Yxq4 "QH.: 0"B,0 G1pnZZ[@ /*g!E#\еeG Fظ-@^^cq/R$i4+GNP5>")k^6kbW Ft⳩rfeV$ח։M X/v#;hjhz+ $A Ai^~i=эg8I*G4m(>qG׸ȳN(E3xZ ɸf@:\%y@Tgdh$8X "Ju kWPڐjjZCfiCkk%* 1A1w73$tf޽q;rBCPH8Hƍ ]@+qΎř;ێqVμ-t%+TTv`OS_X>jQ & iCj{6H@tzF0)mޱ!<"sATUq6ޫ[;(v&I_b3БWWu>-dma!&׺:W@״4SZ1:l-r$AַD>b=4z6p$# 5I>-$w#/8DdT s Ӥs+7^=q$v|󎞋L=;ϫ  ׳ArDźP1cn}=ֵsԸvt$"ީ"yrȽ\[1pE?GvQg]mSu+E}Kz0ؔ%\;zwQ ׮يO}C׮bԨIΎk'^N\㹽l`Cp0 *HǸ1hJ9tKڭ{AoYM礯c>_nX!CJ9{c`rSc ?˘veQ/Vi&-Җ -]-U ҵaAQd|cj 6@-- JPމ`í[#\iWi]6)d}=.4Fj}KIEJJ۟~G 6%֕`u`C_~`͢2pܔ`CVe([^z6@Qp/:v(h(  D@J)qT;9۟^ɵfFOpξ{v_D`1!~j]mQA25z\ ҢϕNXU0XN\F6""1@trVِsjlhq#YTaRJm 5 f !-]?[&d?GAlpm.iΦfWl@ZICgűn X Š-zqW-7K/. W$wj[H>W|߲ٚ|ϢM^(NE[۞g/=}? N7O-4o.,[?Iz{no=I8-2Ev j*AI>֮_+H}ߍ7{(n7noC'@PDzf-iLN=L$v829IQx}0*t60k2cAoA4 ? MX[ r ]iZ6GI$؎p=RF CkU #G QW-sz 4WvtT6(=SKk~ngÚ$-3OMh[y3Css YjBF;![gJ{'&d%Grr@zIPԧ&>A?jL2ut1IH&d7Z|BXgWxϵ)w ҋ4#RBy["Q*,EFRZ=}L*ԥgl*q2yl@OKïH(ZÖ  ҄ J3?HXֹ )۷@FGNr!Z (iaSR =R!<޳=t%lX[$r Ao!z6(]Nz6""^k0+P^uu~Z<:if\26;w3ݲ~ҪG}IZ 2Nװ~ 㣐6i{*jղ&XךC/{o\nLG I"`;>êYAv]fv@JK)͋8GI#G\ͻ>J姌 ťi-"үg384?O0YfHjEG= }Ti QeHۄ67+=r8H9} ?(tLS Ϫe֥ ֏.S9{Y'9w[}smqCu針2װ\ ӱ>L{-tMF)k(a\r$mQp9'LpQlk iurCd:hUH1@+ú\$T>ЬՂ$L⇛3Aȍɑ۳AwfZZٽ-QO%OB9M|:X! tT[H ۢ.PT^.p}hէeCKWk4s^#GQU%I#7`Hzס~ka{YPͧf "7`_{6P~J沼U}/ko<*{ Y:l<^ \ ͸d(ͪQ`d_~֋'cA<,mj&౔+ B&Xupٷu#Cʏ*y%Ku,Gʃ eF:[yۇ_(jɀ9SETj  z6Ek#7/bdNJgEkXi V۟_ ۢEF~OdNU>u+E݊O_Kf[b[lW@LH!ۨlb%KKTlp } -$OޞʎdXv{H7ɮgs^ #Zt:,]ʱmd{/D 5Dl HKB#coOws{ω/U],kNJh#2n=9{LTn m>AkZ`D !$/W =V(5h`jV}pbc3mS!!ȰUeI9΂ ;=|֭ S)}gҟrR };M?[\01vփ~렄^rn3`~Pbl}ILӠ $>L0@\a)A\=ړGlQ@ڹ-rlo,Vqkc2wL=Xcǧ$eIu'Ie\Kd}V9?/Yx-{2 $'3@e w "{ 2Xck;*umnx@W$cΗMI镐p^!!85RtX񎆳f aC&\ʖ}jcMu+buL G OIX1 7 $Ui=B$oAu}Den` z; Nt^ړɬv"I÷ftid ZN1-44T3{O/:jC{ǏO> ܁* Yh9b-bZ>idvʐ ׃,&Y,,Ϋ8b E!) @%eH -4A &֙" Ѵ I{cs7*nL3OPAIMjiQ 6-tD$&K6^L],yֿ&[&Z诔*4V+{ZJ= ^iWhk齁r/p+{ @©Vru(\#`yAzr #lt=h04C#\sUwǟM!WU9#pBUWG`U27ZZ"! D f-?+^W{oµ܇\8> F1Kp+R%78KaN3\u( f@\;!3HŦ?O+Q$Ut-3 7՝)xLWHN~.SS#oUj`}n:F?xp%N@kWI7&/CTae#Gj#G^޺A+|=)2TWA[yO-hn[@Q;C" .lo辶P9vJ+7b,?sH,h@l^FΫaa $LHJhIEbnj}G ./] :"%%'EQP E#?Ynj3Ϯ3/|^gW=+S@*+EErK ^F{$e4<oV;SI:w wO9rիH'_Zq]I+so,+{,0=徴\YV `t7H c`sWrihx{e7w(ai8e9Q[|I 6a IdĄwId1B+xVZ5+%ݑ@rLWO_Ag%dD,u %hdJiDGrZ[+âq#v[JD!0vd 92˄w4eNl- AyhNwI/svUke:-Iu7e kD7MfqV HrTJ|[4<#]^P@*Ud=;ޭat>H ҙ;p ·;oBS{ qy3;bӀĐx@7֔U=$3-~ Id7H_Req`$ѐ y5ƛXgQ(MLe+{v i]~P)R]&k<D@P >#W:)B~Z`xB8r?k@5ܕ5i AN99|4B|Hgr'귣x3[F Q<l‡%)gÐQ`$#%AocUFv i%AZAZgg0D v iw:ljI57*tŵ+j׎!];f`kg=ֵ?R]aEb\h $o1D qu0oU~كkttҪ= wN}Y{ž\/=_g۵a%PJ}]bqx) ~:oH{Dr0' >⩅m*s ҡo-9@Z_eFG:$hG`?wFf8FGW:nr~i'+Eu[8I>ŻE+{Q$5D="8F \b#;|VA`5q%GPb"@dN $AR˞  }F~tUnwĞ=+݋`hbla 6@b`;;{B=?#*b2~]MNǮڊcl8"AVXʭy?>@ 1RE1F*ί>Ompyղ&e à sG`Ԛ53rrr2t3YY@^M{k\A60u|end*Le s Ҹ$_ F\ /{s$uub霽w x[,ߟb_ ovP`-Zhz+sSָv'PPV[>pf^.`WzgWԜa10'/ECavH)̨Q995~SǺM U넬Cg/1*ttj9!+D;ٝl}`1~Ħpj5Cʢz$ ՅAcf{.LP a$A] ""i64~sSQaӂ)4O< 1zLR…DR;d٥YF? tiZ29׸ V*[1nBj"猤HP삗] Zfճns .)ɦ&sZIj1sd T )Bo)B{,Q"#!z]-%[D:P?uNRFxВ2){)B{x#)Le X"#k!8R3H*Ij`IAZ0Fbΰ0$:H+M陱^/g7ĦXc>}NH2 \J`Jp%(ȕ1z H3fcxwN JƓWk5MiYp+w2:i1]:N]~3Ã?pXe9eO͘ E* EJaÈ#ؐ l-dt$A@YYdd X\;VF8I]}o=`r[oG{Υo 侾i/}}ާ-8y__wYSW;&#)9Ú+`˗,Y ޮxÚђ7hV6$ 3˺tszyaƖkg-ـqX z_M߳A15t"nVQGHg[aѳ((Ȁ,kdb!RsruYj}sKaD[0'Xg-e88h춨6>E{h }^p0vkT W:~ul'$?C=3JG ={g>donE77Xc!Co $}}O>gϵ<8 q}8|!Iv? _O7J36EZ[= O4WQ +8n!|MM [ۣE~PfWv5zQy i#^ACOS3>a}.~>neǁA-)}`>{}IU}3C ӺbIcP8;b,_׮k}! GՋsKueg蕰5GŨfb?_9G?xpƺkh ‚EK[w`*2*삋w†u8H^A ˍrKtyƍϠW&5:ONnZ<N$ @`o){=wh;cM۷XI}$ -RqՁ4Cjs >,f|,L'} T*{xV6?NNB"k׵l0.9` D=:E>4yKOՆ6nf@!4Y 4_h;wCf/NiGn~?U4lxu5]R#:!#N SL0Sq21oݳ O݀q#v'<|֬!2Ѧ\ɕzHfi$e}+::csx DDS~2LIUj[;csmvh݆|ͽHYHKI!@JXY$¼$I#''Vk '`gϊ2\SN"M[ǂ@~G1Zo%+1zyR˜uZ:+~ukA Ѫ 㤖`6b5`b?n՟&nU$'P d8Z7|2ě;IQ푴I}xiIZ ICR}؝AM,wW_p?q=Pы/6`+rH M {b'vLDO>Jk0%OG5(Ԋɨ?vv0|Rt#Q抋Yb<Ӣܢ"\r>%۠U@!9XU 4 *Y,AT̿s pkzXBlhl#:;:6rXv0x٣( tS! uډE)-jjkIZ_IP Ѩ͙?ܼ0OӯB,$7~کSC{uqq5jzl)ZbҢOWo3t~V^W^ҽ=#ȸ"5!@@O05MdBpj@Oӡ $n)ezq? H l`GN Xן$x](dV=1_fȝRArt#8@B]+$$1)OB~x_a/6cX=5Il y@IC#-6TX$gjU\;Gx!RcH|k@$-I9L?H|TWEΟ0wQe~,yvB`0$^nдitu ĩ^,t+sݫH5sGg7p\8H~*LJv A"tKΠk1'AY1bYv׻kAZ" U5Ypq @–ox}04/h%H=}x.n>>Gu7RcxfD5#uN5J&Izie+͂ǦTV\>hҟP3[FųlhF\w™3rϜ} _5Uڪ޺8yvXmOz/o7QwHvj-,ē? .J /;746ب{T%Hz̳{0|Y+;鿼+Z xV٪KH S馶"m "ܽukff/*u_>s/L0r 5/P|6ڰd|+yIoJ&SM5d!ҡ&E7qo|6uW$e!e>ˏ H`gfbciJA>fBhvX)$\FrOP@n|ҿٴHIllJ,y,RSѸV,uIEj3ZG08)! ;88 B+:#V;Qli :G!Jj5H/R^z-{'y23枒ʻM(l)iiʛi'y:4=E$HG PhpktjDJUYSM>;59zi@ $1D⽰IJ\'cR}'>[2" cϤI o$ԩݸz=;٥?6/:|."^nj_\umXmľ[r'i'rVS*[yyfr0P O4:ma1x1}H }oXA dѧFhBx3, t??8> ߪz  }ꊋy޽cb+@XS|{ewGM $ﱊ>0iqn麓$PA bI_ <ĺǰB*ee$iҤEB![pO~݋ŵvԃAqK$ 9ӶWرgy~(ǔ3lܸa=rME  ;d47l)oI!M".7= jkM~n$XkW3; !I AZČޅ$E)l~I1*o`F}Ƌ{ZRbA JUOQo?v^6xpK3-dAՙ35HԲ ~b㎛kD/#vnvE= `%Hbiʕp]k ?YPl۵ ݨYyqpD 8G̳WeX~Y:(msp^8%h uTzyy}wټ+/ǔWo2ZKsZn_ -4x}qCeaAl5f E6b79p E0t23I Z  + ]/ HM8NEP~0AA;+Mq̥NpBs(v'];#Ev|lXj!`C~~rzl@GM\쎦OBg*>. 깞_).(i$aF`ÙH 6 7CJ)v U`Nv pO hG+ -#횩>,qUU&7s;~1MMa[) T NNjV:}Q.Y$)ʰJH;zM=- {xc] ez޵k`+B `HH$Iaw2ڛ5Gw.21VH!ti@r_gdׯg DbESAmppyAJ>RN9U!`$4R" H "o5E:@oi"DJzO'3.{@oG(9=fG mI_ 0I>cO ;o:L9= A~t,(g%C0+yj2-AzW;7H9x?!ki93x)ݣnxc1& Hk{^uܹLS\{1R2-ǹSW+ q~BôtaHMHl3Tʡ Z̵ot=<8HFw2db;.T߮ -gwh/;IpB`䄬l`B^\^Sa)By!%WT<0!d?EYvR/Ir("b+w )B;!5=nE hͻq<_C2ɽ8G %G Zvl쐈}HEđGD ӱ)#ӟ',Y'TiSa) *%$~h :8q7@—2@U{I]jhTb);lm ׬2md;Rc3]C9H@2EHO~BQ{I.25w̓_LDR]%=E,N(m>$~Eb\t{;Hd/=MZ=$H%*.[e)^Fa},e֯ۧ~8 BÑ<ۇ2 I*DR>/8#%}*FITG -&9b$y ]LBӚ{TPP{2y[ިyZf[x(ӈ?Ђ$gQQ9iVc3I«MD%Ji $ !"bָNev qd} _l @sRPRsܕ'6je!?(wjĒZonzH %ٮy sT0w ,\G 54J1&;ȏQjN)BS/YiǥIwS?ljB]v}_" JK2,ԋt捠Yʨ%35gVĥnog*0̃,L۝>8rEV[r_rgM>%]kep3R_zLуx T٧`(>5 2V Av#,_p]d_`Xdg`3 >DΡ5G>lO&w۱;nP h E5QAqS;+)>FD~:Og+=þ4t6O3ᮧzmn}um6\BLLb>{q.\(.?}eZU\nF2鑈tr*5u_SM3Oy?[o0kp_T߂,?eZgaLf ~Vn9~ s릷3$Jڵzö]F];C}ww/w,Jv\4}OB#Az-HkRH=;`y40B> JSd|mxc.Aw𪎗&9^pΝ5-/=H"`~83PVg煬 ], c"\:/\xZ , ԩKЩS/*dB/$/fv =#Q~>~Vi}mCLEnsݒn/0G:POٰvWmolmVNip_$["m[0o <0?1M55iB+, Q7zhM+]5R.%ͼW9}圻8pM! f£3oafΤnP&BԸ….YݾZ ;O6s^ SpMNd/"0h侺'ɥ?nKz>$$Ic{gfώն;w$OU>Y^+qXxȘ &=#D""Z/ .F'vڶfVqK!I/DUt#1ΠqDwt_>0Z4n_d`4"hH)n!g PdE7#"@:!=z޲yos ce*Z;rGee S,&ᮌ17phy1V;EP3[1? @>c7#ԃJL:!DzJ@rF< U- GHͷa7@-QZߒ= }`\hlog,a]8P5 &?uu= a{(u6Dʌ AM>N$4H# GI  M(Hb]d%}y| X8292ww Ea=am:'O^&C^mQZ`2L:iӣ$hBh s"l}baKo-%ҥG.vӋ)7H7n8̜H;Pq]'F00/+ZʼԷD?n<"2rT]-I±(YErCg̘3W:BC"$ZAϻ^tnMMi}VwPU 0:4 #ĉ2I)->"` ot?FIz<@E:U .~vC"vZi.h=B:xΜ`DaxzQ1ڤZAf{ܘ#A(n҂OMN3"HK>ÅfGsf`3e4F*cGuD,$.`-]Z]Pk(BbuJW…aJl bſd׹Do8qQƌXjai9/M0UTOim'j7$owY"96AjkP| K^YF_hh_v2GI8IJ7K͑_L0!Ec$l6@Z!`ԴCX&;ؾԋYd+`*-G.D΅ ɻSǁ#oUtL0$R;Z94@:@"_.0JC<9Bkcca0.ߎAT;j뢻ba)C(,ыc2tjAdձ_a2S8$u_4}ܱ5}L?}?(<$};NRV+=S_u2NiHKaZƴv,Fb|1 C/ zDI} ?Q@< mT:CYv䥵9HkN\XWc?woܽƹ,Q4f*LMDъt'+6=d>c~gmmZ)*JfA 9ẸUnCy<%G?RD];dc5f:PڏC!dKN/@:ڵ߽bb$ޥpIӕ])8j6I#p~>$=KB/+6Hp8Gkn>!O ͔\fPts\k|2Q? CtW^ϩS>$k0auz|_"}$>"HQW =I¤1pVmޟ~p![mjչk1c u r0B䕋4͓#) dRDQTQv0))K$^ 6 ۛD"&sȐL*c Mg~AZ2CP/;AfHEEEt}HEI6v@:Q-gXZ u-~ rY*)dq,E% $9H4A |j5){ 6Ifr"<#xF(ܻ#Ix[Bʺtf碌'*1N~TMSB]Ս}Ο>XGz싳W9H)Mk&q<~ϊɺB]ҝ,\SYw~N`-al"1:';sҀR5IcH8 ApxPׅ,e_9s.1cƋ/  A}Z,\;SnKZԕa:AOh0WptL̗GR7kҴz_5kOQi'kc恎m#וBm=Q4H|o CA'o֭U I H~876b"M,B!(ҰA!QkHPax2p&d܃ʅ;1XFEdMBǡx5!!5gKA+N`#t 핤1|n 7JW]iyqh> I8ۅ"+_1HrsBxOF Ku#+'.AU E 8U&@̴Cc |2.IO oĺՄþ<{SVca&f,Ggً 46$ $A"a fI sH9t{:@I }_ &E9wm::Eʚݯ^NU!NUuNN!UNLd'?O~cԉQ<:RrL: ΰ+*f{VH&߻xE k $c= 0Nb g%tFQAJW;5j)] "ְT(1\ҽ8W׸{ q*Fqg%]7ƪ@Zy(~|'È`~j@( HWG' TEAkMeW| ԈDvc4V~UZ nz"H }/LSI qvG =~/[3eqI"@-jk];K Ataܵ3@`G0#A$Hا4RI#} IALDîxp Ko}MU?z*SpH?q0Aq풕1$CmQQ !Hku*H*jslzh$TŦөWAMaj(mmkqm)&$T[KjhÆF-"$S0|,n*j3ćAQ`0|(w/MmQ$A"HOʮkgݳꓠG|t /Kb"' 7jBAHbb~^%@;8r! DyAG`7؀ $QA'@RY`JrI>/w21ऀd$J%Hu5u5$7pm@bVnݢSXY@m-E>-+_Aڢ\?dEtnm΍-S 6H2[T_ZIJI74c A&HqE]bYy~J[Dq36LhpiA!U]ILRkcsZCA_.8pWo©z#P@2~K?w`""gZ)u~)o:9.Vo:*g??P92Nc$a3xi|*̾. HK:ؘBuKfȑGF H,5v)Bi?m-ia@WgQy )-9g*lgG"HAw/,{`mˍmSz6 YMlHZTf` XXbCfˈX:LO \_$H=H Bvpf?/}W @pGr?%WR5<q[c0l:,uUKC!,$ 7ߧuBV"w"Q bt$RUMc$%tHkWիPAx( s}ZQ){r"Pk<{C8@s |k 14p(QY oL'W\NATT)HL$$1PZ%71!u+=lZuu }y?@R'y!Ŗ HT`Q4쁁!(1]RIҀqcB ,ofH|ZZo1(ODf($#cKrk珯\wpUUG)B.JF?'ARIhp)B'$Hr_y>ȝnpI$m2J$I_c@J &@E k""KHK 2Վ6Db:9p#ɋA: HD /B|jP9p io_Ai/HGdĠĠĂ܊DX$6 V$H}l97n|y[l載^/;=H8fhf)B 6U7>aOfO0 II8G" w~/8{rY}ʺ#A[y)Q $|o ?*H]]2xvd^ҪX(2AUX!>a=y)4* I$tqh *@޹ |.hIvl$%ogG#k -l8Qz p( E+n !aH5Ht^7cHW &H:+WL"vhJHZm$ HT]4hA $ #"{Ip$n7 6H%$ VAjF[o"c> "]*ٳD6s$J8h$Eä^$J&]t]G_F!-8D ?>^FQv_0*in)uG,݈%#U#is5B%Hdde~wb{`H0HGTƑ#g$vR$"idHɐYو 1]aձ.hAwZ5Az%:ځF+eݝJe-ԍC8/)"[veHRp.~ۘmEb$Aڱ]|0s CSa$e>>$'g¾Mĕ{eY l祛H%"`g9?uV$@#dNXNi=q:vV7BOc Sݜl @Bf $H0EٸzLsmݚgQ vؙw>m۬6qŘ%HVJ}r3 v\U31F YW:_A>  =[Rj|[ +ɺiJ;_/tg{e矷eDg7]*,U>h꘡QY}xNfu? W~&<+i u_ַ'+m)1E~$[l0 Fd߾R`}Mel , |UwL)=8I"n۶+zϼ޸ym >즂Dl߸YZy((@/SG-zkOjnM8QキnpdͿ<'l`ʆ 0Wʣ ᫴<#*T zٗJt NnJ[[׭4'VAݸ/fL 0zt5e=2mP5iq3ߎkGkn}m EC퍕mex^ikM2c'm=8tgwٳk|w(̄Wt9RPK߃SDXA1N/Nҟ7/2òa1򱁂XPEP["e10D 38b1bh*Lmt1mJAQ &{޷ }v{s9ѿry(]d,)/++}͔"oAbiL }PI' 3K+Aj|/CK?u߽Ƈ@YGg$hr>y Ε>,~{vh!lpQFIll EEa| u3HUIud"K99rX7jUgaOT?nFoF[U&.Dii=~D/Ć)}ϩp؁Ȅ ┭P8_=ݧ (a <[JV'쇗w_ε,h_7P-vF]mmjapdXv^ևH9 *^+&*_?p`>Z=,-4FBċGyy:ԥcF@ԉVB/wfC34=H2EmK;6;T>RqPKK:ZZZ gM m[]zMll0oFeea&;pc{||6dI9H8o>[A LSz6ܼYH 7XE #m_ih{E6 wIIxHLbQ(\瀯\#k{i?V+틃 >^Gl]7A/e ZD0cksxSWXLR@"sֆ{ NikfGyGt&p8yf_'{elk $aਵ?0O6 @iV8.o>}ٽHݝUj>}{t3w/@4$u !?qI?4;HMz-C~T9З?pWt͛سa(87ìrՏJ}*2Kd̗ɩ;|c1ܾbvɫ}>0%\FH`kUo1׿\il71wu_4~(=޻4)2{|/_' %~f#4E2,]^&ML+}c_ߑ5l <izfQ l$*P o?}V{bφܼܲp ׁ}ǦPї"O8wTk,YjP )tP 7pf=zh(9JZSyѵkpRZ_f##-jhm}CJ`iowlZtG'y> ")@ &o[~d"la~މe-<&حE ;僡/G)C>0%5q@Lav dҥ&I 4IJآ14o֨y՗ $$sNbH_ឮLfH-<~$m΁6'm'@`*Ho矃"n~@nna%B*RʵwXA7$;$/󵘿!6iiIA&Ӫ>yL;y!O;_5XpoMƆݻ3 ``W'A%VEqbw'kJL_ ==zZ˚Ee8$$5Ypd2"kxeϖBX}^Fʶ \tan;JņĆwGӪq2oW 3r!^01=6IԳA:M"og4Hf#e}zSXV R UOBxCi Ev'M(L6&nN2M SȕEhdxd_ PU* -G H փ h5dԜFȌđFQr(Vfi ~: ]Yц@H_ӗ mH H;sMfkHE‰iOyi cjI #%;Bp`xT 4m-B-[N~_=҆m1 KwH틄IM`" s'skֳaMvR.Ar9H#=$& Y gi_6| 0HE i`kf [;Q=Hd)O5<(-'`lPR򜰧CI68BﹿrȩG-pݢn< Yx3CŷN̞ )~ &&qVQC#I$P氙oͬg wȆCAΙ6Uy"&m(!;8-»+v)=aWq&5V &S53̢ ]l|U`ӛM*vΎxbW]ňH!::g_><*+#=֗%YDZ&E3#]nv$ ve *UQC<H|$LefFyx`b;$&(fl:&T9IRsE8c ȖF#0F,rɺ _G1_i2 ;lxӰW8H89#%cԗS4Br==;C ȋ@Tqy1J2X_rմe9G Bps8F#wc"-`^hZ cK{$m1tG4T߶I : Gt39$_otn؈!-HRiOM['Yn@H0SY{+t줳EA4FVԓ[`b e$ٳAxv8#0:aG"QwVϮ ZӶhQ--qPK()%sjhR (VG$D!t7#vҗ·c 5s}TGWo8$%)G!S$)$ќlPi ~,ѣ@`N).AzFvZnnp 7DPj.n` IK5H )4!{bUWԵ'?OhqTL؈#m%0.z9 6nyܟ'Yk{E 5'dC|5Vؒ<\Yფ2s$#ѣaT,v^([ֵPp|u4?yDՒWk)A[GթOwz!M$GdX.*k)h$#l!k'[Fb+?%T"墄JRdl^3ԱcW) yDUvG*i\û}IZĞ p`hh4:~Lgt/GƵu{~aK[jiIՂ \<{zH,u煔4$ᇘyX-#*Ier}F|xI| Gw`ڲ] jNԼx|2 ek7ZM65S/[ V쏚=TUw"o ί~IuW.)m<%HrĖ/--AR2[Zi)6N'E"P}J)A/0ZH玅#V] t$.efk욐 [EFh90\VV Oҳ! P,Em_sN&hKOCgg*j]Z4HP0J8go_wKI~ =WoIU&5M Gjw,oEѾ34Fg}u>f:"Ar9r %LRpJ |P,or 5fÿ$%Io5GƦ:-">,{6'ȬN"?m)iu*z@߹\[,Z YvjM-:K/Yp`eYt҈/Je-9I6ؐ8LA1ˉyR+R!ӫdʶL1I?n҄S*H\<4ٯPI>Qzyzb&,(-RF.dRj2LQ2UɮfMb"λ_{cw|p+K*ꥌCqO6M ~ Ix.VCSehF9q^H\ڹ!AA!-_L·'%|EGYU VP-.Nٰ/Pl,vOϳis?pc( Fmt.AR/)}:CvRj:b$](#޲AlfA!LD)W?"A!I:)Jv`Մ]rha֖X=A;]TSܳ/߯%kI|ǗRk0$zqƕ5gʕ9hֳrFTb)AԻEqj&0H0JqGOrMh)BʃA[#92sポ It}GZQcNLh}bqmYІ~"I L EVvi1H1]%;wj>@˧tD@Q eGN(+ ǽY/JV=;"#3PmJU# &҄C&3)t @adCdmaFyFuaQ?V]ZZa.f- ׃rchhG I ;w޽s|frF4&.XhH^'9GZ$>7{O#-dFa46JgnS@(t̙?h +/^\II4K Ib_`}ӕa}'z 8 #Kq<$Uu A`KkҎ@_'aačcaCEBnl\(D qS] Rb"LT Z_Ywʩ@"aNȂ9L`GaZ!o(8< rIVV wI[1HBA *ʳyM$Q =7n&X);R~j<˾6]?+,qc*4CY#Hc#PU40GvBiz"z{z' z ,ҦLٵZrf` f_i9wAqqխdjmGufb]!q2LڝгYYZmz{ vwVkk$9)+11gT'2],Hnn|i6pjx y =2[(u+ g..::a9 ݎ"~< H&vH١&}"]HlWKEDzΛ?>yw0IF\9cC$΂w ; 28IR ~TiF#8!b8aȭc4Ȩa>TvZXLK>ai >D"ܮuG4JNNI\ |sH!iʕ }r$_' 쑬 C>0{8jۥN 5@%M2Fĸq5!J8f;/k^c=cG[R?㭭؝!c@R@qQXR8KbU !GI̧`%bhq鴏:R<˒r ҳZ}羝 J;bf,T!SG8i=<۾Χ _y MwQ_{~+r, $waK}h}۞"mIoHUˆOm/ " ^DJͬڦ/\@CfMS3 X:12ȟHV `hxY_7 f(Bo0J4D iG  QD; ,!F<=s?En zbviJF-vɰi@3)fO9"IYUcÜTkMy 3_^륚@\&//r A*ݻ*Hs_~ڵ!?tk @鼽+DwϓE:!@@Qm")*jM .HH {} BE,~78g\ȏ* $AduG.$mC#f5/h $2Ij%EbF ( R)i`i! lƎr 3&DfSV0H_~o97IڑER#$B bu (?z5w0H`)/CCA}3Cl5p&Va`|3HEW$>>"@bt$ > ׄۋ-=_]8Nt?UHb<ކ0RO:I HJ:!WRHģ2^NDTU!Mv!vkci[lH΂X=Y3 9Я<|CU'S c"̆Po$ݯ:?hѷ 6GϭJ8uϽ6i$HajO $IzvPXÃLڳ 3m`[s;f:n$=;z2 ZVIQQ3EB3=@ٰ'MH gTƸ=Sk?PbL(LD (ʵh~J𫦆8v[j񰈅r{w7|*?Gs Dg M4HnAAnd]\;Q z@wnR'Xlݡp"wYaz|`t;wyFi}uttg=.Gs߮o^ƱL# ĺ !Xt\=8PRvi8v%Akl/:\RAT,6wI,sj-cBQF mX4>~ +6*1%(txիr^ulbxu^"V}fm Eݯ$Hi'6Y0lgx:ïx]g;s(qF]gk?J[=-XP`C# R9G⢢=Wf.=hle%gns)鳆$n< $~-rNMuPY06mZCH>\ERXhZF iG((/sGNr̊VL a=8o#tԆhn;{DL'£0VJSD|a!}ѢSGO.j+o ,$KstѢea"x}yk]@:f_Y)TR̭[7ݴ JR&@\ #͞]~ s_IUw'*/eOd!_6JqAޞG3nBpB2wx8 bȵHQ"Pxu2.*-@$p p97\cPAR_"]QE oiEEaG&ə ή]}k 01Rڱ} "i;HoqŠ)@ q~;w$ `ã˪FwDС9TvFRh 3˜3[*"э[ul_ KA#]:29 &`R5[hUU !i(-B [#NQ=;tB kПIm ɨz:ivHUk kha8O_@A Y.REO={<=qp8W̕TQD>^z7>EwK0J I/|7}z]]pI9#"帴Hy۳, HG\ UL!&wi"x/ rsozr C魷؃l1iѲBb_.͑ Dw @$B~u9/=Ep1.:D%)= ۹5uq<1 #@$+Z8E7k(aŢu*nH۴K Yuzi]O={:KXAf}'$ mOKw{}_f _D{DIa`uгOlHC\ԗOSӞ!~+ S@iLXbtSc>d4#Gj1$#{JK 1?RzX|x>ԍc@n RCHl$W)/cVRlO$! U<(MpGMDj 2jn.0 ̈\! ^ H=4Q.|B{_B}i"TZnCUPWl 2HT,W !׷ j{5>H A@Qe)L5WcHBտ;nI~pIq]%6}RAJIxAzxљAB65u'7Gy;Vm HqYȮOFwE3g0+3chR 4ˍkd&0TE J(FWC]bSB=(du-5b/ܿ`o k6AW' /iI = ad9E@ G-3+^܅3ϝ/i9H腇ȅm@ ]7~M3:C)nAh9h%|{52Czlz0ٳ IS峮jJo쟚-5+u6(IE,_3,%@VEVs$ޒa0Lte @)4Ot::$_d`S؈=k6W{ 5gLJ;vCx9%lЈRc싡N;?ح_(Ep9sZ:Eᄃ~D+y:j¥e_(— '鯷Y12xVRMo齣=EK,#MQȎ`a2]Z|(P4^)_ϴ6O*O 2$T*RR?e V6F]qU?@oѹ fFH$$# 2Z9 +.HIhϧ]=iϚ?Jea[|Qjޫ lfZ!YzZ$] 7ȝG 16]OC IB¤H> s/q4qI m![Er 9ݷ ق^2G )#)E H:+R^/AA> Umb۱vJw)'hjm=/`@4(Y|iD 52Dg *=~?.@ r V ?l?@S_NP}HG*͌sC)B<}\P~fs$#XRn0-`!U'mTɿ]k7p$5#Qf^k6df$@GG":bAVD! ّ]]Tk_>4]Z 4 $&P΀POZ$eZV NhK[ x$ a[4@:D488QME`9FoD%ܽewE_tobLE)yi|cu׼+|+!a[\ɓ#ʃ՟|W_ّ cǦ=>{Y gge?{:M[`?2I]͆wЂzY 6֯Fp+;#) 5>Xmx_*Y #qح{܄}uX\O P{Iyqܻe@7H$V6/guZC^T ,, aghH[ڄE;FGđL@zQ0Ól[wbգ/7a솮iǍTF>|8kS=wzV)==?j|h8G&]nu{Qc]Luu&`;a $>v2}XZI$ڋ X԰6 iwz:mDyڲ2sYV0{k~Y8חimSV*G[6вC(90O"8qӼ@ a'"fI^!zYyG̲kGhcSzɠޘz$wjp5 R^d QSNT^slb 5lZKRtV5 w;:0He#GnJ q ְ}wjj^j :\0`%4%ᣮlrF^_"Q.3eJ$ڕ 16pqTpMFK7nرhG1VφGkg^|j'gհ $F^b gH>P1QY//ޙ{ggHg^;3x󱿰1J+ư?JG(ָzsI1tiT]Ec cI4҆w> E\}aH)a "[ZP7nHeOf#vl[[-v{9m''?B&dst,I>(:i8`xC>&ԯG[͆g ѕl7AHC葰F)鴡@ImAZncNQ9@a*q՛g!׮Pe5 U$ٰw5;K;*\zמ܈% ^-n8D}K $뽏)9BBFgL+ʙB;8yqN. J?5q㪵J@T^nQ[ɝՁy@ؤTD رwMT45+?9z$!Fݹ:q0;4]Tm:y;^<~.|䄍MW)i1f^}i҅l[1a1t=m04 D-k0n`BkWpluSͿQ͆M]yϞxW%+,,+@W7<·k0kG 1C¢rZfnZhd>znH#K[zXE'Y#@se l\5q8$.}Iwȋ d닍qn&moc}둍_@z1?= a@*iG~A| P= ^Bj*Bƞ kEK҇O v1φa c[J1M1MrKJ1@1&@l }W٠Q>V3lD)rRiW Bi  l7)ظVg*j)&&ɔC- % Omn>m8l=|'8HmD>2 d 5 H6M/M$q d2-a>5hBr@>ۢb繴vpDg;E&bi@:J2ͣ@ZH5 ad9 Ȋ;裏8iaф (EcpNw_,(qJ "H CQPt/2؎;'%>Mxo)}~FҨJ0sJKp֯4ȞK=%T#QQ C/bh1y8ERۘ\*i,d; Uw.71[{4&I][ԑȷ#T j6 O|yb;J:پA˖{1-OʌU~!.zMlLHf)KCG1!<܆b lH57C#7z+"ءM '&'$a$DjD5Ҫv߸*lh|#}gB#zZJZ@BHI}ώNޭlfH55Qƍ3RL] +#>B2M }qEA@B6,ɵ{]j;LOJ!^N@b'?~r n]9y@y; )@:\zfM3kΔ7ZOQtC ].}gZ6H2an1,".WVΚ C3#yW6#p VW_=6ثA sp7vxg]MVpcof̷>ihƂ Z4 EoQA(O >6 eH;ގYV/"gLUnf|'Is0 5JO.E͆aԵTT̑E8$%5GR!fk%pJ{l=$8>Lm#8#Dg$vz-mdU]'kDAEHѬ!ATT&@r=*O{W+~fa9Hsbv}4 C|v8ؔp71;3Z-!=; $yl v:Q&63xcĦH":-VtPw~`DN;*TAc CHAHH7캻#HqQ͆X!-^HK $6.lWEH=j6Vp44B{w0H6>PUǡlW짔=v7tibU7K/eJFST}U%*A,7iiDV9(a$U]@.\GowXliZ+&FUxaH[o]4(z뭠EBnvp3?{իcǩpd,30Zcz*M?O4!#z52Sٴy|A6B[Q6gzـIr c @x,![ZC $à Pa)+ɓƇb@pM*9[] -jc45#A $^/>?ع6~ADvVTIA@H)BC!4Ak#XU ))pY6>K AR.Ȃ#FrAgG$hQ\AExwk;/vG*ĶAld} |4Mm94n<;īvQw~ǥ(U9QXh(YNiF>3[ޚI߉1696F'᳔c|?|=[|+$}vo5T,V0dU#-ҿcHۛ!{ qeTI*'aVheHݬ9!.D $ < Maibm"$iIm{lP,k'kA8YY~OE͆!ҥ!P3 IZd[0BR55ܧ}ArHixUUULRgN oZ%Q`YctZ1.(HA g V'hX.2FY5\x*\3Y*m^C ZjGTe .}]† 7+|qUMXS{F!ũsq%I#U@4 # K-.XHh@"MR&rRK "Uwy `“DahWṷoE0 t0 c }Hհ;EBu-kDXjimZ>>ۨhmM|鐔0n oHC[h(+/HQ 'H꠲c(oƆ9nQD dF)LGnaE*>C?9JK Gظ$1#!=Z7~AzGv3\e(KokҮVT—~=uP乲L0b.pp\4CQ:Pp~j)/CeGf~^![l\9te|70J̎U 2,OA~h 1Wـ} D o t}&yl@aTy ŸS`}R4HH;Y`6x-LgJEX={;دl ,Dz^4ЇobL4&L}ʳf)pTk>dt9wi\{lpTs WR͍\$"`&L SLVϑPA>R!y*~Ŵi+eF "b"xOoˑ@\cX:dHIɐ!MҘ=!#eԔ,]"^HQ)afZvWOYʊ buycEʚ tdC l(oY٠yVhm@\9v̿7J2y4 <VHQ i1 Z2S9$'ܞuIPp˖yQ|(82wE&H s6ٜie%CNtB.퐺33d'HB3}e{cUrsV;OukIPdPn55媧6wQ+׮MVJI ? MIsE?(=뜫ǂH gPf[صk׎F @XpH*@wm s6Ym}2Λ'N\9ÍKWH >)t/ ,OevT@m yC=r%PEh͔oeZBXXR5cRDޖ)j6l}pjZbo I  q$t K[H𮂞UgomOc3WQК|o|=I6zp$O _eÙU*-\$3$Ե?~h#7NYmQ,G%T9I"9H QU-G;$-LL0ay$!$oO U2q!+2)( _X6 H `J:Ԅc1LM4 RQ:K <]8f᧱c~Vj%75%sԊ1;۵N Hzv٣Lt3UW ]ӤY?*@JMl\41S\;^^$ÿ{kb(P$H~&ơ۹~5A#7W R\WL03F8S)R;>I6t4[zݦ= +eSuiOκ2$)ػ9ٛ7mmJ/=Y$DvMNI,FϫHV:t$;v~ma~HN3i_Vyv 2JqlC!`$Q0ojP9.ѥPA's- KY!b ҥK/euիcQ)R)?n9{foT'ǡ _VM{4zG5pP覷/ӯpȜ)s~]DvA5Ԫ^Kd;n-C $p$ >!-gѧ?@Fd¥C9r»PgxlcއԳS 8 w&jҾIG̹k!@;m@r9Ԋ rL(*HZZJ%c4Q'^Z.|CEgHQ]ZM\t563I%ꕚ! F|cG9uu{õ7C+*foy/0q7켝 z`a# kOE בk wک2vuX^D|)E |鹕W3Pk6" $QE2= =\s ߮H\(PKAqwjKY5›# o1Mywѣ]@"6l/?p DzۺHa&ٳ ͎[yKUEqE | jq#<;>G*۱}7(ÜSD(%7A·*6j=Iܻ=A` )3'הzpg=uUѱϫ q~;mR;ۗ7eK`ȵ14#<$͢2DE "P3N1@z fFR`eKK%~@U{e:55`457^dJ K|g'r#w32?89ӿS᪅w/'H(Tzhxvc^ @"F|08e- 5ϙsā,SFڿ͎DW͞5[W^lHLǠ,fC <;cw6>!PkzU,C׏kW+St/XBgS)}hA{{LJS$/cBjM%KՍW_QeT\UO<Ωg_}X$8wB Lrhmw;ŧ)8B#hjh. R z-Jx@y%H`sb-W D[Hy= ۻ \7k/(oMuH IƵaB:U`%,/Iv$ڝB\]z,58YKbV#NrOXJv ODNs/OJNOp ^]ykvj_J]oiP>45p*މe;5[Jp0ty&׮G uHkm0[3ܽffC=БH'ū%EѮjx٣d5%@K釡^--S pw |T(|8\PzfC^SsQҋt:K4&͜ҒUe j-Ĝ\&7'Qe%P߆:4U6X|,mmvCY6$IVճfýA:NrϼvE<Q8J=A*;iG= f]/T,86eplAe*wLT$UIg "EϚ d$9K"|:V/ju_o NC \9Pz>@n")!1Q%X&䷱w<57 ;hPi)CS! $6["˅R@MIn'VmF5bVLOfj#j(\53$ЋAzϲ+Cfb}q j,{3 (9CEFF}156S6'Fh.i U2}ľOf!ߔ[G, )cR3nhk6$A? pt ! X:fk*qD#c[(16xhˈxAgIVfŊGWڪ5bQ +qNDF~3L+Sd $8O}A^ou;wD…)ɡ> v;wud69 Gn L1HU&N HڎuCo Ú̟EnӢnu8ӎ 9Hk?XQTMſ5u~b*h0H]\4G Hr:=NpDq{d˕+'_,M~?(iu:"IsYEtkj/1>YXȔfDTAW  SC,vx,Z #֑YS=k6 $CG_/n&HE5#Rj3zڋĦzKB#I2fr m7HN >dqR |Y_%HfJ/^[Y5h4FvVߥ7w/?aCc [_xHzH|{`s4,!8rs& "EC!JKH6fI8 (@eZ4c*mLjSHp5 gʏz]HK˸'ss]4D яȰ%6p̝36ԷrNSqHY])B͸'q4Xޜ*R.{6( R^PXqeLqdH,֞ RzBĊXū5'+%0%+fM8D xDy,]SR ݒ1E6 ʷ@#VjMyhvYBUbE׿~^2 Atʣ6Eȧ!o-HT-}a69Z$i hг7aCvζ<{j*!?8ox`]ƛ_V dHaE(k+EkԨTS;춽*F7X[1RlEf A~L|(@Mň44;f.(\l܀5< [_≁۞$}wu! =Q>^rh$ȡ7"c  (4@ R:0&I,/*Eǡڲ"SφޥC`&6iK |l HmOt%j'iuI$@g<_W$FDU]lHMGA3Faq7릹.z>xq t4c Rs??{/ZyPX)tWCC??vga9+9QPs!!Q LR^C/;̡YAȥ{6@XSZ?3Ծcӭ'l:eɖ*ǿִojC]Lc嘄t858fDZ.X``n~~! Xƥӕfʝltңl|UDyA*hEz'_h1Lny|o;gU९ܽ_FҾ1sʍnU]TZyfj(22&|9^kXS2vY>cIJ*z1f!/L`#0 .ADە=ዴeXSI3=ޠDfhpcφH猒>}ΜtK@-=*Uqj%JrՎKȒh?(HK4¹_2>Q.ySFHz7Zαi0Ĺ>`mh,d/-cRtU`F#ش50taJ[6VZkR@ZϾVf ę3  ED=`B+v2._2q3^P5,,ӏGW&?[z:mL_ ?k=B(җ@R7* &UQRLUfs9`%@Hh}z&&!U44yT1u%j ;hc?3+a DرjIcbr9X=c-]ecK[>{6i,I!_TxʣP IRQU&UYI1cpeLʮkԬ?:vV=[*.͕[VV.[~}Kuuxtﲢt*AY-H}$?`,}. ÐNWG&xcXlY]*]`i)Hg $={T K2߿YvIj'+*M.P$G$AxEZݯY.gFcɲu ޕޕXqO>Wbyi,I_~c Ob7tfP +A u ں17ߐ8ͭ/0Vט<,i=q)ƤPSuʣaLOӆh}1?Vi +=_#[)cgcz>۲J%չ[NJ[|K֢:9Vl3F餅[^Y[=kIC1H55 ?VPK}t%&v$І԰GlNmOKcSO1vIO}>>>iY1XKK`ww؁&sw/ c[юM~\r)&{WArݳT؎fӞH ߯R Dsy6VV<|w[^` ɤqg5 @ mt z;#NZUs߼y?gH( ŝ;mZiI ]<5Ilz: o;E<1֪M.)X׆I1K-_k-c)L ;p4V55af3 9ܯG6I%?X wc]rn: g1 )(EWj^NH}2Bal̺ZrVQØHԆrݻm x}ԋ&xu\|{%\e)&)4<$Zge?=F5~7ܺ ݨH!d[F{60B+r(9vP6~p ~Vhd/xj{#Z @}?P`} w޴:yhfEǗ>w31TyJ{yItWXIWAXPUerSNrn2eRoP Au ֱ2!=LNkp)\3w,;*.H=nCs^e8tHc]vcJ&WA[EWx hh6RE)FHLJ{{'t+?q rHvc6aH/_H&b2Gu^/@? cNw}R.T/]t4I/Az6qk2|.5Ϊ<F$ yfGgD/$͏Jz6fm6=`rHPED_'St ;jKkzkHZ[qq Ѯ?x)wY16ϳje?3Iӱ0}:N$7-UK#dr[k;>~__eP[Ju2Xǐ)Iͧʬc #|*ўilIm1ɜBLz1x 6SZ a4(Zu6|$斤$y]Ӵ;ބ}0Ic9i(`cdpR]~駟>H*v# i#_h͚""WB-G1NtaNVe$H5Awhmr1OӖΝKIǎ_h?1d=)-8r ( 3#lA0NJ*QDuP07wv޿yLR:NrDp5ُ!rk7,\p}嘥ւB2 "ڌA iom9IUT=)Bܯkbd$pQ,EߴtbvR/g9VO-cM$%ٍe&Sr2_9W(d.yekϱo9@"`}aV&ߞGw钮όohMHv ٍ'rkӔ>E6c !p9B$iPWjʾ@ rS^dqdH07r'_ܹy/v"_)(*9eXRWw\RٵSiw2Ģ @REe&CMTRtg|u1.W@ &xY $UG4G 7iBxlhPh/|&+ь5 gcnp){hl];ZdqBsi_ R*ۙ#)5kW=%**p{vV٨>k7 t\#u㥓.32ʘA@U5vcΖmn\.|ʖ 1L?&c@Ea31$2|pƍ3gnlHս?"k e/c,ͣ ~]!rskqD~SaU~מ}ӛO؉cUIUyXIwUIaE\yIRy2YU\]ܻr +ǽ 9 O OKMkJmjH0 8A>H:dfjä $ (zfd1pKWsW{ + Ӵgɇ ܫ"]{+l,G XI zva+Igd"JO>9Ɖ7FS cmUU8ՠz`Elp]N;9x SZٚe7y:5r3#ORg;Vz.9f[X5Y#Y<$uqr'<`p3NJNU55U_4Ҫ<:+qfx=E\1&(qqŨCbƾ+flnlŊQƿvԌQ3fbÀM~g*eI D ?8ƄFV^/I#$ԅe4Ron=3w|tuϼ7|Ek[*e`1T/ALQoM&cߤ4:̞Lq۹28٧p?y%y|$9FWP/~+9w}51>6K#oP2#m :̙9֪D/js^!bL+ )nӶ{cH^c{cGcš1ڼGГ YΑ`\`]8fS}N]?D*6ƿz$,ǒY,8XJĔ֎+w=eHtAG&H :؟R RYZ< M0O[&ߎ"v5V;8CcG,j Qa \/ >Z`,ck[u;%j['_;f?e8-Zԕ::E7X<4Si :Ԗ|)cEMn I7:(:ݎV:R:6N1yK*'6̥Kf~|թ#=ŷyHhjNLi>Ej"^ƣ(Z׈X#UTJ$2c6#~"P=tHxި"Cl|+C$)֊!юط"G <4%GXa"\/k0~Ie!CF5Nc[Z9#DZ9MlX ҍ5V{4LUdeiJ9lcXQ#KtTZ}{EEJXדHO2 qtH8y?Ĉ $#$ b-c" 0sĀI* ⻿p@D1#I7``9@rag~3ϑvvV$b,eYҪȆkv'ܑbe`Um Iε47|SO}gs\77 8rp1&9b(.ߺZ k(N p=Fvh-SхEVcN Z#a[y; /c;z?.AbBxBTAZ7Cءa#8R.QZ)>8~nEjz-I"+ Pej3GFc1 7vг^Ghe´) 5"GVV)BVVF\/J"e.Kk^#FY(gHA6rPAX`$uUyL f$V!q.e=IDҴAW,X7}LXG*;9m,Z#<}(R ׎µS??߄E+onҳ UHB'g, \f x@\he 7TYqae?q_6l3AUEO΅T*2WDC u;( ME$ic.=$IG(5liQ/GA|Qr?0 4So$0*0F?iϏ==<a@]7cW#!"7ƿ$*sw;aN -;m qvSǿ1\L踓ÐU 3ۉZi6# ymQ! 㩨!u d`r ѳf%*zR̤r?z=XvvY37Xުvφ|ex( 1Bo^+77` ; O?1 u!vW .9zxf="qIC@Ǯevue^;v`b(@cުFFmI>)lEtпZtAnӎ#th)?-z6RҀiiC21nHj/բ9A mBzt 8lW A&mo+HZW=-`<[e0鄦Nk@[jXfm!,FX$sE6CDK)6ڂBȽ.Rjo|Omq4w *=lݧ 1EwbOht@I,(L<_j"B^,Kyw$<]ӧ};:tqħɽe\:T6coশyK@똖Iğ=6_l<~dz.eYZw\ʖJWVUYy<_twN٠E˞ R$Ǯ o 8j=teٓLpG6I<Օ WX m4A9f*~]0zIkE :˸y彪aX+Rֿ 6) 5oo`chum DvXDxy}Bï)vBM(@93Js4w`iΝw)̳ج<Dq_h R<#O <;,C+NZ؛Isb͎˂=ER`1@y饟 0>qPc2'_{y5RφleZm߆7vru~_\re'>2opjB][Ce}]φy 2D* Yպ@Gw,dqEU96C~XJ2rѴH%0iȔsС+WO޸~ XsFЃ회Lr#TKc9"QT>L mE|Rr%Kf͛cUoVt+. ŋ$WĖGW+]\F=lRۦMp0;(EAC낣Vi>gDo .Gv7kBf U[ӲߢDDo $iK~qG+l@]Z*g?Ͷb]x@ ĉ4Vo)ڽ$Ο&)~wD|Y (sx~ΖO?5#t~jM$~W?|6G$|ͺ9҃GV2Uo$N/ 0"Au !iAcdzU護D+sa2>D) ? a,ڮ'o͟H,$)^܃C݄ӝTܰ\ߊM1tC8NVHLI 8_\ǥk7vd<m2e@[p^^? s`8^f6(,-];G׭hIZƑ[Aܾk#Tm8I\$%A A78Ԕ|,7 ȩ&/^Δ0D6pd<'#Mj=bq@ IaȰHoX' u$LkDv,qC۷;g Vtea|NC,bw*yv:U>ԡ0I{6P_^r$-Or}Y mVF0 q}KB Sxea\`st zHKˁos93+s5{*'h=zstIs s`(KK2|8H$HLŗtEiIvRdVlHƗum݂>jӽl$߸$A‹KFIJHmՆMau~nJ+HWl?W*I;&-@8v,_?v,#7,p88w^iIHL嬄אF),@B$ΑG9\ߎM'mve>̊`UUwܯ{7DGz) !@ϦH$:N)$k7n>t$H}~nt Y0m(I(y*r,Y{6xlȕA)\ 7gI;Aۿ$.#H(c0~&\#鳷='i I(qR "vPs vÔ\9,1G T\Ҵ|b2H$74tm"tFĝ@Jpi6$cfMO >Ru &<@ U\5#" 5?ꋣv!"_s$jrl c;o12koNI?h2"bc  `]l~"c\~8#|#@:7MA+&<aYl}{Uwml9@"w"c֑@%r* "۽oI˒ R$PIߧn\ԏ学)v"K| OQ8 cO̮2˨ibH}Whԇ$48ќ`]ȼ~5B=-EQ[AJ !8@vaYDcܹ<`bŃ@$d8" 3zj~R߂&5Jɸgapưoh}"f]fY$a|S5  BK"wbgN9Lk86w1krÔd1]iaX1O7c`p ǯVr7v01ߎ{v#{aZ˟eA;,3/Z[>6Hz;B{n.cHY I+!'#^Vv|&C+.]tA Єb.ml5|ӣ`}uF;]zP*wxGHWp5k#IX㰱lZ~l஝i KNl@SΑpDW 1G8os5PTvomEu+ DԮqQ[HLzMgoL4~k^8HnAc"UtWbrHI畕e4Z>~O Ԑh>: , ,֐H{j ߈) _H@$qVMjy}jomZb.;0߆Rin U!J&nHcD1/u׏kH?BGᠬ%O]B j#5JZ$'r ۅ 1Q"QSNqZvF͵lvIkJk\sog=W@zЉ'Nz8JDso; Fz!,B'Ee;hk-ȳwh);=cs$Tk] nذ5c| d 錑i4Hop?̆I{H@wLrl\3{b AI"qKv =ݑϑxﱖd*Nn9ki%jC1l ;%tc^ޥLSp%A$Y HGH =`H$MMM5@ZW׆rظ;t#IV ϟxM`OQG +}%݌"A P6Xl(:63F2lPzRKW4EN7cϽEweDH89܃b >Fv&!gNQf]5 O' YYz~9X83ۇ  1c.dh@]Y$cEQ HJԏ@z~Hŕ6E$M*Y kw9~.z+]2ZA@*iejilvBڹ@BOb (0cq81N =~S!N9ځ(<䳞 l@%wtGlL="Y>M#̵3>u3.Q|WsCZf;vPoo#Ajk ؾS=nZHph[eQ+?D}rܹӓE2ŸaF ӷmJ%-:0sEN+&H]\y@1tf,rK 9d7{xy59pX7~} ($AJU@/c?fs^(,`*z+WO FivK {AHe@ dt%ႎt[$S^UO<4jQ2j|VDY%tfwPTgSȻ[)8arVp4/~CX$nABL:jgCD,cJe79ũ^}kLYZ"e2x߹!Õ7^չݘ=ۂ,l$;TL1Fݑ" mAv\|{[y'Mz_dΑ>>Z7-\jV;:wˇΝ;A8 w\LWYFY充 KRS-Ȳ[+wF,q ntbS=7ڀD71"#[sr‘&@RME1n6ĒsuƬ,|{oA_/&+H_vxC H%h2QAOo&~;0={ ]d'E```#c{v;8G7p^%Klh=j+ZkW$[NUO>}~KHk{7]e^C rd4 )TL̜աHBF9vRzǤU Pvr:Y'f葺y I2ax<& ͛ q>5jШQT|@,,ݻ4'+O<V |zU˛@)5\k-{_^2߹=qbك," ' @'\/Ą,󩱫fLfFJiـ:+w,y炧t$(ycPl`~ &Uzi׮幻|쮿n0}-IvSwΛ# }zs$5彞3)&v%Y(jcHR~O! )/=lW{6Gf*R[^`//;`Zŷw*7HEe  iѲkCCYLFmhȌKZ ,! ;.hc%V jo!Cd, f>^ZVhK'Z\*??f,2"&tZt eOw͓822Uu%ļ#]:69.ϒLJh|UC깢zi|ӖrfBW91Z33}+&tΙ۶~~KM>< XM6w-ӽAO'"YYk]AnN>7֓@;_c^Br5cAF%EHgIu$ҫX-:Eiii]-«"Z!ě^}k_9]vW<$h.E <,x|X,i+Ov%"*6)R yN@L¸ԖAP 1X- 9gFm cA1Q \{6,egO50H$)ψ/?W|ȊW`=, L;f Iќ- U$_İ?h_.dG^U.+m nݰWh*YMVW`Sadzn:sۖ;kTu8jLc %Pp(A%II%ݙYNqni*SeV-E&"T=戴OaJn^X}(cw"𵤢x@TNI|%pTH$R1 H684Wƽzq_y}w|IUs|I<8rhk%dڐB\KHS CR03yǓa)/< &O oTgݏKN a37"oI$8F߷$a&Jַ3%r?h^l}{ ]0%V/솃(%OȎ$54 Pzzِh$*zC?dYrx%*_a43`յ":csHB1~@iު?R?YK#7Rfs /L ݸ*]*|* 0GAb[5x-4}G.#a*ѳ8)(HN u"do\ѨK$m &$ @ZCh1ucatS~}$v=<5R.]0r dַ_׺W`&j' N$M \3f& ^B& EcPsn1mo!&b"o_*096k¾Aai\*nCe8M Ԗz~'_CpNF8En8r'Rzx>$ UsNڭѹu !E# /-dfd%HH}u`KwaVc fx[(-oP,R.s@k|aݺӏP RuAzoUځh>EASέ,ٚ5j*}#7}~PUHtar7`:?gbzg)O`{[ n]mp?)(a!bА*1Pbzfl=>=-2%$~`Ą ~ Qx'F#(H@4Cφ\G@og*dGIt2gFɓn/4hgǪB*"]LXSY jZ9r3?r3F-2F*WMLS>" [.A~sPxvp#9&vkOK& ^:!"SKMp" $BD!|9@"N$4Pvr{!iD߰CBe $/k옷yFp4*mt^#d9zu_z5̸ y,_hC܎5֍=e,\q6␒pg~ەmTꮎa{I=nLCHҋe@A(Evi%ؽ>㻛P ^v $D椷M[bviNxAWNU@2H}Ǐk[{Zص#%FX_>Gj͛Â3XkjD[֔7o6D ) ao?tY)}Z@ * }6B泯-Ʌ-OWŶ&zm[w2Pa3gntȟߤNbs|_}Yqۜq7l*c(n7f*& (Nv'>8tWZɓ]OD6rߙ6 RfKpHW9,5+8AG҄BE)pV"b%&e0w"@tKƉ^{P܎j+H[ShE ?8@F_:Wy܂ iǞd`^O;OB%'O\?aC \a) l|N]i؆ htNY Iيط{a;S9کiJ5XyZImX|۲f2we}2,u)f & ZwX|` \yRQN&lR쑡 Ar˓b V%PyRsR(  GHUh|DUT1n>|*EK }ݟ[~].Eq!O΄I"˗Ӽ L8vLXd68V(c~cS#b/pX!FilbۚY̱pK/\zAi1l8/A:O=4lA k}` 8fzS5U9 ̑_+Qق9c} 㧴$R[϶'$i<^ \;%k}Yc\R{=])AUh9H]-,+ DX"ArK|)IS֠o,)N1({p혮".\Dz ޹ThQi)=ȸyétd#d8[G$w@Rxrq  a;A7ܼ} ͑fsjEk3bw(>Xlk~ᅪSXLl@Ԯ.=nqɕ0:ID#V'ee,Dfat .7qD[?} 6 UZi y {Hu+ #[[÷o:h(0]4#+GQhG ОBXR`:x`4 ?-Az")LlQ)O;qHJUv[S'i PŸ3Qobk|kj&^s>wH;:x׵ZZRӢ 9L3$Ž^x!X> ‚_vu -PVy+<3 ݪ Txv21pQ=M:q?H|#LR\&~; ""IëKaٔrf[ ^ԪkET<`q(mߨ^n$; )-pe$U,k!B5;yM5a#}ʗ+6v.[e=L$%hWH ҙu u7$5M7uPʆR!,p8bcA9Ro `4ofHCZü(5&";&}2._W0C6 H~JM -0[Hg2 V(a=W~Rd]>dSb$(Rd!cI>`t%_|Q}rr=84Vr4: kb!а>)0+${!GR,fS) }tN 㰯ӰHǒ~#swvZ']SID;+8½:a`>4{7l؝#/U?3VK P|펌 6;+k?5›EzxR< z LuNzUښrwu7 l8W~C.__YxF-qwFAlb^[[bMzzMb[[]$Je*"3i rJm|?D>|y1C_-6_ + Q(^sҪz8& #KiJ\/kHe|n ɡz0WfCH^뻾YN-`YSn-nd;Zߖ8Z+wWq|NS;n9 [- -* WU@2VUm0/??22@ r IiM&\DG7<~t=>6XDBElh( Z.T:kйcj0^2WvToXFk2Ze>rl1+76h~8S,+%ah}^c2=jmr2-Rvs@ 226;9eřP"wa忩%H#&XwǞ rK׊<^ $w3a!|D6H=<l=D;\oځk7 =f{yD拈j 'iS`?OIB9R@lRK>.#L2}]mF&sa-:97O9bUmlhJ oV_Vk[} ~"_ohN~W}U!- ۱2z1m]$IIy {dm(W!-?@az$W=BArݳR 4-0;6C$ 3ca_^7&j2sr!BqH0RFy=/HOV;V6\_֐bѓXT=+. Sus5,34T i;;IzcgR4KEAh/Q|MW MQQQϓb)xHepR[_\*_0I@(nճA_Kz#]Ocsss<8!nFN;:L qPWgp+]CNc]9}^Nucj}ƨɩgCƶg5zi$RGq8e By$_u3uXaRh}%^Hi,­w>h`SWEhiZ֘Βl?s@+m%9)Bws ۙ_h崺a xNʂo\k{ţs0<{֩XlvB0_31)e-g_ О#H=P.df%F;KφFJȊH@ bJgrƍJq{4v^5ͻN66@jvﭼI?;vw^v72l }\F c3nQ#*[NFA H99pN[I4"pdEx }V3kyh?Fڏ3vc ZE ^̼c yxû=CR1W[Zr6$955"Zv[S|2s$M !=īap#l!UD-X]JD]Zb1؀ͣÜvkgoAqH CbidhJ|q,Y@W9P†!Ze $&ZZNdcI6 Q' 4Iwfc;3Iľ3n c=)xĄd?X r 9Q GhHr~N%t,|S|ixE+Y'e)lk*4 -{68bv~҆'48$ `޼%Ss JM=R8 NT"3=^چwsڬ%a[P -Q[5`buSOjmx}"S}gx_֪s.ۍ N i27N7bvDV?D)58Ķf6̶-*@HcH#l^C"<͏ "_H:/T-a)I⚲pԲe6uu m y؆*(J1ek)wS٪"ɛi iѥ&HI Hb sht^p,ҮL8HG^r+IX5zOAv'mY R|>=$e~i7TQx*z6.E)RVyn+RLL!:'Z &o2GL1@zN`ɄޘF7^V5[*ɈgVI+Wz;r2Q]]Ӕ_m /VIkIKkRȼޜ%wVI iőQ)1- eWBJYb B_lQ6RooԔ*Ld.3#*ɸb!etXLbͩǍ,7k6(1i|xssϩ}P IAzRR8< $<֣ZG:<Fc}ff^BU<#[z$2tueqm]wGf%im3CQ\4E_,}]Ľ^A;Wy#4_B Iljb\ E*5B"AIV!A@9XH$ޙaREHae3U-XoTAFV ) )#9j@^/^aqJo(V$&!P.]0T?Kn T@0B蝐!=i IPpJHgaxt՟עӅgC#up ~7 UtLQioɍ}ռ9@"&fX,v?5C")!U%0!kbv}O]%_&TBDZq%fڷ9:sFHo7lSt;i/AU۴-&/JHHzYH\V3,$.RHnR;-$#1Nҩ]L 8Iv<7g\No~s[ 3ǯB*u]33i)$|❙IH!bBH|]ȝsBǕZwn%u!_ENs53#'$\.$'ij!W(8:h`4X'<Ã>gNp5~̺vĭ!9֥ EYn*{(;vo6ŷaXh(`vNv~+5կnVFġebBHo5Y$$5 cc}L~)!&#[:"&KgH6dDPB"H%Q82tRM*BZPT8!$̣1a6q9033Q^v;lS$~0bR$,E Zꡈ)=sIJK|hS)H#4 ~ , D jt$w0Btj״y52 `sp]x6}i*ul0T첊z9ag#*gv R$%h0 az#? G `/YI0j7MOwZD]R0YIBHdw>Sj7_>c$a@T zC )]:C""iVY逐(III|&B#ŸtNvx{ v)03+$6vSįsg2wWA]uQ=XYM nK.KC˜p&zH{Lrj†nkBrxܥAz%) =i$.6Z RFkg浫VWZۼYgv Sc9iwlrUM¡Ta'+kgJ-9%(-qyZ JM]lM! /O3zjfa;;v:}׭cکG$>nRņO5 ab*?T놎 $z  ACL`h!Q'dБ ى9:j3z\f2i4[QTRe !MgcK" I%c<)&~f֘׀ngfy\ k-sG/A48A>8x6xR Y^~rt.Z0@N& φ<ܤVW`óV\W}۲9|!bC]eVbCj/D񜔘=)/YI=7ѷ]e63HDx*)|; uu g6 א'Ty$h06ΖIWE")KL)K)܂cIG@|&kxA[j`D҂Yሑ1QZkVlvS# lC%K\LˈۯXHB!1i-$ِ*,!$zϫ$J%B *J-–JB2"fr#Ȩu92bn"OߓHF18s+%$+r,ALX䔧 @7XG[ 5D" r! 4 ."<R|?J <25/׵++?A__Ny6cbW;/=4{6;eZw߿?$|Nˎ6O7o7p٪#Vm]$gvNuKBꃿpVx~D +g,y4[8~䲐rBw Iĕ3@gJJjBN",FdF٩D|뭥:U~EݩjVn2NW :vzZh'¢sސ`+S]I[`%e54 Iy6ҫfvRφ|fi)מ CGf!5^k- !jUc'yPR˞|UБ jOtmtAfWzjIuvE*|g@C}=Xwóf+'t)Б6})l rO\?: հF9ԗ$׹ug^HΝB!sH/ЌjQGS03IC|y܋F}~&]BsYCIs : Ŭ/OY!H!1БC(Ox6.}`TBJH%=⼅Qi0ri~..{pCQ::t-uT}no7`\7Baa#p9ܬY1늚gCG Bq@bvG[Lݍ˒@<$(٢w%rz|- ly"+z]r ɘU9v';XZ&Qtr0-06\)ےREXPa!V977Tҟl~8v65dW^sltNgƜRʠ|EjBp8$oK5Kpص{mڽәiq7s{.4weHQrlW%ր8 Q K=)nAjiC]B}J x6]Q\mΥNE61BOV{\vv.)v@qh@u@h(^ڳAs{bbu$f z6ގ>Y)Arll|sύQʳACO"<+~n+6p<ƒW4dGxz7ZڝirԮg]m AKXmz;KW qB.,ծX!WhĀqG$yp^'$ygd f;DXGwwAαh60h5U]6 UW&Jy68?pCVq&J{γ}ac OT8/ h㝇6g6 -Nɰ{K = ?g싂$-) U~ VӋjDML>,HvBNxCE\]om},44EQPH2snoKMS:f񅋍S:Ɨh2ѽKKZ^*/T`lῳ\6A('iP\4p!,WtJLW'+N,`H֨읜%,N.HMR-35;訢eF%r9B VpgbfvWuXE?blP۷lɝK{6´huHQ]3E遰$HR4q99w3}%4[;PMĢ!H\qeEOIqo]ZX6 x19 I/&qFT\seF_]V@a'0#|u icFpC}[V.9\5}+ עAU,F Mt=/`@_g2$ٰ2a T#xrBT:m=TشF!"g::kɳ+ZЄ98L=ՅHIRHDD{C,>KB OMetx^ARzifUl1P6[@J-R6[J$S @a5X) 2O=$ )"E$IBp,ˆ'VfiRp^$cD#(F*T3{($$D=!dO($S(C}/xxI"!і}B _ rkU³-Pj# 5 \DD1nǞ yn5 &z'*;HI<.w*$x|4Iɵ%K.%$R$DB:c8r|,GIo9S$>Ib{!ɸ>cȿ/;ٯg!{UjΗ *xRdP 2ǰ={p7BȚud](|D<_0V۵QgCvgkҳl#ǿמ\yسle(xc@vc BsX!``>n ܔ:IƘY.t56 v[h 9n2pSbhi=.kf\rK9{*CKc﫭k?<쁐t^ZZG;R|g}#XyoِǸK5ϯGawS{6m쫮F\c=EoZ9q +[.6Xt˷|I[܍p4ώk)Z#cܺó8Q#hi5gljy}49Aس﷚5ԝqmTl=p48`~>9[8p ,zx78ޕ=A_-0>﮵ !?k,γ<SBGDqNNhq (1'~WaܐogCfHz6Դش&Ƴ<{wˤv#4.+sqq2&{pG.ry*Ak9gxqFIdq-zҜNig -dBqM8;xs]B].=m`{2Pl,ٰٳp=VImt$!+0%b޳AJ)ـgSp-ܺ.ū_,:NCMhБG"&AO+w>HQ:y :"?ss%k9!e-8$wMt˚D 8pM=UӪ}7ޮ6* SR( V*jMcݐ4q2QI%`0ի˒:H-hf[0LјFRR$1 b|sNﹷ^0*>Z8}=+()|n!]3@qHda!ik`udF Nf Cag]TtcCJInvc',=d(BسAD}u[l[66A)1 nv5=^d͹2G:2!ϼP>œ_)/M}P__,9Rbd=_2J&5O50`oPM}J`nCUW:-*B$H eIŅjmx 'ܳj&y7|wm,T1KM<`!칇d=5\Fa>5y6H!GaomrA e= Y#P;=O oƏBGG!}3k#z x3nWWQ BC*a@ 8&HMs4q{h-@UVZ )Ή}z |a}%罬R7\f\(J_|akT-)A YB2eDžgÎنK.o<&r?j|++P_M l`VR[!{سv# &݊Y}#)ts].j{y L8A뾈/-D@"}vyӊ QOMm\>}JߝL"H%I{uφ@VGy6 .w^{|$"HI^nڳAn+)l8*ZgC7f` }ԳV# :xzgG۶mm;ާAc?qUMP*W%=/1!WY90g 4A#,#!`%6y ȌvIΎY)ʸU3GHR< ((k4}\a8q99=zŹ\(-- $$HI*IAMpφEZ$,ϑ)/U JM<4:ZNw0z6 ^gˮ7 {*nR)$舄h_˫|UZkkLHB:~R IPBR @@B$pDKZ$%=VB@J ID[!$%CJjՔ fWg8̕˿BW~}9v礨jX+VVU I j9v/k`DSlI{zEB!n,QHgؖste-҃[AH˹̕sLH.Zd: ǔ`XYl8<<х'Tg)YFJ4duaӑl!IHGkN(ݵhl@8e2BPb {.۹s;AN #}u!AGLHl׮SҶff!ڵL?ǟϲ]s'c'!#^FNT͑X5τbq(\Hա$^2!i-y`i eQ}x\X&!!kP K (q$!)=X$#'KB"7H@ԑǵU7zVx>4(qja?=Nex2{ 8D\P0zO }^p qySOlB8T9o ŒLffnFr0r҅H.Wr 3~釼QUMd2ESjPM ى\Fܳ9aJ7 P}T*)$o gG4lh' mpKν¹E`k«,2J9\Re7'Kgg/z~Gp,t$@B[})/<\Dy$yl|%.Dk)Wp8 Z ݞI^zvCH0Y7 i"R t(5?ȳHkk*VC;q`s.mۣ8|nׇv?@vlef >df MT@eӐ.ey5Y>!%b*шN,">HdD! [.8idHBHqcDtd@KO:o\9]z9:ғη+=@R0nDp g8qmu<~^1!I\9&Pm٬&60; CM̳ ^b$k֌J|U(7 FiYŭORl{8@FAU0/;w l¬lld"Mzv2y8ـQ <="C0&Ѩh"Lm㳪Ъzc*lggѱSf䛛 'qqavٟmo?iFϭ3O0Wn?`o -KIpr !χnfqnH~H *gHMLK<IiɓyB^޵J3t"$~3w7˜` i+XޕDkB}-92A̳ȾM⾈惽 Wc3W_u$)j^ vOYSa] r{kgvwș8~&tXy6l8F6RӞ z(EP=V x sb߾}4ʡ/T'ԯ>cYx:tPR՗ &P83VdQ,/~ )v]F u]+PGӒ Ɋs -vecBR8q04 [@zH!|Lj!( .$RK6!Qtvr*OQ._C6 V_@x:[IQlxZɥ'SgX!1φ}`KKŬl qr )I?̸Ň6l ! 0doHI&@=C` %Yy6X-J!U-3ܞdiU-yDiΡCCsn:t0 CwuhZe$q5ԷO);],?]P]6Įn&uxk q.텻ooG͓nAUk9(^qV 0_G1dc$^(Å{e&q$DP9.39gtNX 'a*DAY_c%hKKZ{-<6NhyUW_f 凹rwE#p2әj7i-OɬfnDm

    l;guL;f,7lh gEv`^9:ܶ_9úcd824.%7;Jov@8Pz{ (騕y+06Y㿊]n! nƞ VgT}c;ZXW]W< >n)':q1 '-hslprW1\Y矿FZ9 g)Z9)̆r^H|tņB'*BΫ81aY< @?YMQ!j5TtBƞ tQ\ Uc?=$X&9> OX\EDbRk#E7}{Iާ0 ϕd6lf N.|ySh\V7-T45J5A X9Ah̆E*ٌ,^r.?yMWZ~Dh$hă˰/1s N嗉W p/ C,pkat+, #*/9 #\ވ]DbWI竉LuI]#c0q`:~m vs~ܿg51m[eaeOFKM:X!Ɣ N8h)!xC&cpF 0?ZB EОu ou\|#yueuOFb̆mċg6OWWM̆#꧰}\]PoӾոXUc܌WV:,LhcD M wm,c&l2XM5S:18NB;i K.VӤKŗ}i|N#T#=kڮ8lm.kpȎ" +9`=i*J F{Utc׸_̛_p%оkō2 >)H֬=3{͚m..f,!o&v8)H녏aCo6Mf#/b*ǣ+`bF!8iS#XV` šMa7m}ᅖOr `mmlv7FwHeb,HgkWkU7_sy/ijƅCfC=M ׮t]87y\|mUb[[_:3Hd$*\D:ɈK\Lݻvjڊ]Z^٨g=m3Mm6[_:TΌtͿu 6 sҳM҄>M{״i=Qjb,'b`l^g1#%(JQ0U5('+` aY^=9,>7ܢy_k ~ Qh̙S> d؊f]llF9NX {Ԋ+9n" wtŽd>I&'^Ƭ1ӑuKs:s+%8J3gt/u8)4`ڞ: +7|Ny9Cf״тEfU6#}zd|#u#z0q32l N1{JsnBKN%%rL˵,x0MSiPD"7}ߧ6SJ#1{^5B}$'"F}`9NXӱ L9C= Hic;>ȝ1?{,%H,&^\ڝ]G|W }Q0cwϴZmlgE+!; )9HضHH(g95\-HFɅx|XRF#3Fd1UFuj9ѣQYyD}<._K76W@}Lb6cϏ@z$Ds6VEIH 9X.2glL$bӘB-!GPMh=QF:qm@lɚn>8q궪H 4Ҕ?bSWg(=+7UڽW~uS2sDNͱ^0yFg626MW44 FM*;f׻<8nU̜(j; 6eڞ {-)`鉉4T]`)L6]L4tm-2K0b'UɊ #XJ>R|-UtT lёbI=k2%x؝`,2@,0=w 3&Km꩸Ts~ed9˒-&ՄH|v8~*I!xb!x-)Qtb~YCdFfĴ4O,+)Gfx2X _l>S2`]@@%i/2uS)0ҹW\q\Vϸ WlC'GE lx"M)/-gGT? K%ʗ\0L1sڈwYk-74ⳤ R"{B‹oi?1j)lXCvdɉKi8F :_[z{K#%_Q<y`KX2AH5[&s)>wH`d`qh*K F=p(<ٰslFjrg yfb6'Ss{7lx2ٰ} ,ī k/Sk9cS 4E6SdZEגJu%DyKKlY 0 D[4u"N,#A1)nJCO|/*H>o<1F}$,F7 1b RK`VOSJ0DkF=0,@˄9t;<22=t("=ZE1 H0(oZ, c(|^JGN# NM HH ['F:8!un>rlv N&-d6/_|F큓ԒxgѓMdW595O[A"V6?@#fmmmۖ<=_UdX`SJ,>mIk`C2af8ۀ Ba}}9#0Z;VIb@:{ZETHZVI;x(2dztV9Yn`$*<rM'(a1L2gFꜞyfRslzg#̆]JZW. d7=o|#ՠ72azzP^M?Y^MA#/DL TX뛿KcC,yO RpH,r@"8b%Lk4'?ʫ8jby<`y~ 8?ʫ4zW|@S5X]PlKLa_o3pJ`#ȝg>Tdת|9HxfEV'(g6w.ᤫ< Б3عoFr }#̆=z`ljj! _c/{51+?0w%chT#zO=Zm]Vߕ\ťų⽙Ъ% ЪH*^1%uĜR h#8Ũfn8lR K*z1VX]ƶ nYݭ x)XN{uiUaFݬNu g]Y7rκ|YBf/Y%)98@Xe0%}*R(O9|jM=nlZ+dVA?X"8۔jԥʶl6#;"7#ΌH-cbI%Yv\X[1VWr`t˝$|d{O@b-B4zT}kI[Nz:Vu{ο{̺:Y|ͺ`JSAJd%slp{$J>r lfCj#ώg6 72u3НQog:2(6|ٮo6Q໱"U(3O:Xr0؉tll= ٞ}kv1Yn䣊B%U!*9;ֱΠ=3aM:e#g]oa8Pux fkv=ooE vS̱k]oº`]ZD]$\f]5 &^5Io0HZ){キrfTЯ@}uqg:Φ{ck)!׬j+\ jhaPCvRvԽ}(RJ0ljWb&ugQnuퟻڬ[j=.u=F"oo5r QXkgB2w-0mUa.*d B*f f| o̢cBab[| n(EɈ G,9 [,{O/tUc$~˷:y I !$ClenXG(a1M 'O~V߳aE%+M}⅐. pٟr`p)~š=ƀ+V^$Uu =v d7Օʳ!L}H*) ȂHwg ]&z'%ݵGnQrɅ2HIYe;Md!"Gpnѣ=5U"pGJthponnK &I -m@M@=4f|GE䷂g קdÍ\7o `cRח 9= lXB U!Al}=Cf{lbhljSv^φ%5(B"HI<|S:ᛇ2 RՏm\BY`P!lBOJ'[e;zH,d^H-&Jzyp$cQ7*x'zn9jzZaόqYhWebJ~'QMQYrT/UJ&:>"U:sL.kf򣏘H Bz IBrden73+}h]b]TnaJJ!knT].g'+J;;;R*UF|_0_ӛـo;eC6ti'w:GvzX[Zh b2bSAsX~Rҳrb}9($+hö h#ؖ鎜DF7Ap\2+ p:TNAV+fX2f;ln[e wmAC(ok8jLo~QI(+I+inJJ[w>K3gXֽُxW Cxn\nw(*?ȗպM1h@"-7[z6$)P ҳASk"$?Á}̳aǘg+AڦlWH'Oxfd$.t@D%PAz6ʗ:߾mٳo(*zmTfnvNh"7iXיL0v2u3v(Pݜwf!# 2"좝 :K v # 't%Y"2{=U;QN=CpZ,{QN}Tstm._lfmR丒eAJzuݺ{?Z,_5p]*r4k?9Rrz5}g~&"Ғw q φ q|@aYBH=  \>%iBjx6]齑IE4=?ަ:$rBR6)$j|{ݕS_:z)>ep;?:"mӣn5Ş+-:zձ2l 7ɦ_l58\ Bp#8{mS_\;rRt7Z~f3X,Gk .$^n/׵׉cfZ%')${1ly<se.%G J#es't<)7+1^cD2S φLG'ɳdφnI]4<o6GBDnAyPBJO^޸J rKg']yH,G`$)$FɷGRRΒ..˶tvIw;lY^Bɾr'WǮ$!IBT *tqp"wF)/\ø\"b'|p!$k>8TBԞ8c?Zb\5l| !sOV -C M;ܙw٬r{ء{/c%H3]yG.q&UrNù*H(hw Aҭ1 D f E {6v>uƳ 4"54 !t1|^<% cvh#B'D{?H!P  IݕD3;)$G$ʷ'! M)H= u Ν !D]3\H}e&޲>>"}izkEH5]07)01W9\ʈdGv\>"QN|5x -<8%?Gю<8[[ ⪚c>؂]cO[?@ B ;!(֑̚kk^%&?uosϵsPEU033LoXK & 0+,X晘i [bv rtPn !a R!)EsT/RۏRbh jrაH=z>7HH6DΑeP}õ34sPi}]2>S&} )S;Zi IY]񄂀O }Ts11ʥ:Q$ad;܅>Vuw7pN* ::* HI'P݅d5#cx^WjDus1Qƥ%5ז]:Y~-R>3 N_;]=={ձW$AH '@d2)q?M)rpC||(*}ht?ۄt>'hj~B֚#߾jB=E809I#7(3! -9LԧQa (Eb[ ʶ6ޱj <~PL2HBġ(;OB 챠jDSskqĩ%}>Á%6ŅF&Cs6^zi:FET%jXYBqU _X9cJ"I%\%2qJAyVs#ݔխp'ݔ(p<ҳgKȲBA8¾xWh=4)B") \Hӳ rl3W^lIH})$@Jҩ V ]sd*BBG!$`jã⎶yCqQ_K`O{C^-@,9bG.XQT.CVJA؅-3.SW CҖ~Wt Cx=lfIHfpC aijHH\T!R{&Qu3Mxak;צj87)9U9o\r@E",Ě]<- BH{%c\v|Ip{D^sZIpn;knBH#+I_bbǓd.OO5 v%K!MXggfgg! ɳ: nIN6A x6xaKBJF/hȷ>~ s} o/6ȣ <7~2wI=t$٤(:#WgaDHHL2@N?q"c]YbA цٌlgXS a7ɉ]c3{mKQx8j Ds*VL:T9L0ʭŸB{`lc‚ZVvվ 5Ոv)9jeݎ0b=Pc\j!8+kd'Wmq*7m`_&2*-[x k$e' <2X~%bAU .X_2 (b'>-]t0Kˬkve6ixD~5ڸrlϑ}|4qVkOV+8o曷mY%ؿ]zpx>m[Ѷ\(D)W E2ȽY^`Jz%C\qܳs5rmM䉑Vp!]Běr !О $$oB"iӳQn%b$՛Rش΄[h&gNHQ{z6"@= {5<;DRrBhE#PݯD EG,R/NP5k -_ؐCU-WԄfv e;[5,lɉSsspz#qI3qmKb\\vS: 5ΦZ'959kZƍl &t-\DHHHssm=>(+Z):|GQiD:"!1%OW9ߟZJjU >B9 FVԱΕԨ,VR#$wbn2Y3"B ـD>zG% "ِ[R "\UxPQJJ^[( ە.K$:˳poۺίkOەggNBHW@<K ia>ʌ覟 ,Ԡ[ |} ԩY(FƳq Ld8gƄZ+bk8[Z> k:WŽ==\K==ѳ!j-L:Mu .ZշkFIЦľ$J~%!U)q<< n/qi"-&w,Aq}i-mt<7KVCA[2.ެz6`Ƴ3 ^D McLGRaUM)7]lfv?]WM+_kCz,Hη'X|$hócGw;q#E:PPRԇG/fx n]k2'|=lz$8P+98y8U!93vG%g]mZ%gW|4'p xU-vG/䶶Kn#B}_&3PxbI툃iX&YXeoUIy%3q,h2%msD]][حK*JWH5򊢕_"b+JȆL!퇚Dt%V`}TQc1jbsϝ30',ts=(u2Sf#]gCTqCp ]q~ݏ~ ĩf忱fu*}_K\^Ƽ<}{(۳#Xb#a` j̒2^e Mx_/ꅣ~xoS˰m'aS_Ƕ^eMV."R0m3nsI6Fo"qp۞noN2yG Fyn}J0QP';֒oj⸱-6ogm=S}b:jFa֋m+}o=lPDhsPC9)8x~(s m V5@ 9Q!K;WzVfoJS"`( }͆MnDPk oܻ_{m7ee붶f͆W`nW^/`ED\Ίx~Ϳ7$]~?[s ќ?oo޼Um;顐4D MuAh.IW\j>ry>[hTɏ{lV߀.׫A5r6RcV r PcD'&iZjKm]8|o{\ˀ t@hπPo%x՛OcKU8Y~jZ9_Z]% juj ARYkhU2ݳB.Fs7/J+H#hZPDJ!-! RG'.F7ws>g8`۵pÞOnY@k ~֬~.tR{ Yj:/j6mm=. /jfő"X Al{xkhnXBKM%BsJ!rK0:?l]TvR1A<_Ư M-_}esRmhצZv jp۞b6㨲p: >&m6~j^e%!gt7/$aM2$8ڎz"!_ 0 (9ܮ]ssS}l`v GZaOɏ =a쓜k6<7[ޭs{\Hs §:D I-7wzvֿa5z<8qٛUO N[Kգt~-!#t=_C=+B0I5jbA{yk+ LE2@5[.O_c7 O &3>i%G&i`}5&\3|E#;$%|B+hB!NC>f dSo:*Zn/QҦH 5@eeeX7$.jgnKl5B$8ө#BvH6A*_ Ry9y\(K2.u5v"=1PzAnJbo݅ Yf)S EOL" .&"6mo8p$FXzyjoJYlxx0OL@: }J52 5H[,>G͋1 &-$mHlsg4䓴p@#ߗʸ& f&@!": a| h{. OnK`p%;1oE;)+v+$@J?GMig e+-m GIo,JТx?V[3p(nfgbK];Z|daeג"2 bFAZ ҐG'x쪇Q$azc \?CIvFD;lضM%hibĂVP IƻBţ=H-\ST}O/8XQ=q)6cb,w1ZGG<w6El.G/Ɓl䑤i\ø12qHdEQ}wEo]f]䚚)1 a .#@/Z!(C!843^uwy0nKjtݰQ:; h'E;FNJNd|&ǽ*Na 56l(F6efCg _KAT[&i5ueJDd1@Z@$'E5?sst(9OSs xxփ̱8 !_q 1q9\'g x[f{315T94E %Ka3[/vA*umLj佧=ojٞg|/ٕT2u,qZ\rgb& \\ S'VMy^PB{saX>f&J>B9Du>>3g읙ctq2[GykFt/C5%# f  {AE`BC)I @JlJJ8jB֭#Dvlv3 R%pT{C%xHK^=]*+!lxݭ[#oKHamgo54f2ֿ^\(@"Z ՃJD|$F(/!Z9ȥk. !RA6K8spIyy?؞gn~gQӠz R?U5c!-'Rrp01\jkX~OVNr:$NY[n3K"sswT^^r#@]^pbI;T'aP=1(MHU!Xryu%f% Rꤝ]cW)ױGҸ.jBl x8=O갴 97>٢9 0#.'29Z|FT͆l ]$ABX-%\(i_i@eWQ+0۰j6tt C\=qt:В$8 7@$2R1H2+o*G.M8OAj^>'dkO0G IV>0xV}pumg!RymX 8!Xx|]XEX_4&6խ&i[J&蜧- 50A%[%tlIzHK$43iV tĸ`H. AN*+4f+n|u#ij {(c1;an({8O{T ~PեiC4_Wy7-ټ-0G\"$W>#m]wױu{e"Cĭq>;UFFLԱI,])9gd|{WjE_>8/fZߪ9AպUʞ.{$HB RI6g֟2;v$2HXFS>2Z?{4Lv}i-@O?97%cDUn/8ګc8[o%'D2`[e`_&$q=#z61={6,Yް&Wn@kϻaYh#v 8i9ۨ[:?lhUdtHn<-X8%0Kew_F!G>_5W`:\ ^(_TF\l Īy@pUbݫV̍]$-m>q;UsqF6-ӓXݠ衎ԩsL22`-JێL2 z ih_SoڳAJu*p^ 2Rs0"76Ҭ. L6[;Y8ژp )m٬jQOȎRS^zuf晙H||DAJfD_@Bk$쌟?wu}rMMʴ-[Q-Jo3im4^%rrZ)Ќ2e Cw޿;_l>elȽJOSeɳ> [nS(FZ-e1o.+CWFm%Ƶw0@v$zOqƾK?ƀԧUrˣnG(m?::ZNgXS|!?Kt)spkʵI^xpOt5<}_,̩_{gv]SZ~ cN߽^g$kK bKJޞf|l`)Uebm"|7R( ߉m~~dxtsVWaֳAdQcARnkwS!o54|kZ#uOHďomGH4p'g0|-)j >喰e-kFDs~$T&/](w8MA8|7Mzh,N$HlKɩ-l16GHIt'M_=FD{ZAJP ;41H2O6f+[A I{6P*[ϣrZR@!;hSv60׷NKrg;xlߍdFR^pڿG)ze$k6k2.fϧ,I ..6vlZv.Bg-[ bzO"G%|$ 7IW/6!\ &mZIAiq=1'_yFjhSx}F]K1<.@>8YxAuf؏}'kƞ)emF 'O^!򆓓5amFLz6?HmR*I-`r|-n' H?rRݒ-KEY~Gbhxs]&0jQ co q$ޛ^t8ՑU}cDA93''ܹ): 54|Y@o|+Wx5W6 Yټ+ ^UK<H=  u;mX!0*3]dUee1}K#NWn QIS|"߂ރ-l%AD) Iܝ}!/YȀ0vLL_(z;&ZnLxvb㱒*A*ja 7F ^qe1oe37 fĀ!($G~EG-q$;HLsb֡w Zr#VIJA{Iqm0o22HEzP]uw D6`.G};ԍ! Rk|a>W W.DN  {M; mڔܱg&-86#;t0eysK| |0dcGɬg߮4wrC;$뎙==g+Vr4=J/l,J1ZT1glu&7OI~$IP6 W#w'0x\Z*'T]\I$'6w-MRn c[p)u3C^a($H.m*H02z$a9-€RPRA  a6%H J{.!kBOD;$WO߳a[ HzֳYkd gC=,sTC 9h񟍖[nfÙxR|יi r$E9J#;4TF]abB;vitr \\<*HvpuI%'djrIg^!ߧPX 4N UM$G]F w[+I}ZY/4C zPuȊvpZpx"=,is0PիsD$JXa өZFi6OO%HՇnn-"at3Gc#D;ozi ҷt6 C%mH򱔈5XAJ=N~H|; yB}Vrտ@zM/ow?xʏ&t??re#Bﳻ.~ZQ]BցtIP1HQ_3Ƈ]g=SxM ՈnLT Ϝm$@ h;|F!X \ Tɺa$H@K2;\R̆2qDNl֍%%?{;)O |~>X8KœI8$XE-ut""@1wh?SYYS ! JZ\.y ΏϜ >v;RBo`Rf/c 9$HIpQS~upJ\z '˫wbD @7pW¾82l`լێ85%V U$JR>\)hZԴrΜY#A꩜9Ӊ;( \$Id,ic!NC$IBс؈#rT5EI˓K*=] %ON`wZ5*@ YQَ6oj ]Q4)@BCD$%C.pQXUŮ_0CjW|ņI:b7 @bQPD}饗`F]&t~l RfhЀ%|RF%X>xh gk߉\EDI4lG_>!N 1}،ּLX-K_!ﳍ#eNG $l0O=z6_Z=پ%h]@Kf#y 4s R{Jj )d2HbRqrN/ƃ;nu]H]`wz@wDpWse%%E@c}RKeEM6P79n,R 40]b3 a\xݔ$) q|R; 9ɥ-xȅNt*Iv2_'v*5x|nz |!TD@Q҈&<9{iT1*ٺ6B+8F(=SyXCC08IJ7 NK1lOD۬$-t#=OH,kW~~#u\^\Hx|'bD >+I!1)toHtQ g?[9Q1sIXcpwbtIz .r!C\<^yPX80ԪTD NqIC#N%.kTAB-BboN2 C$,}`(#&Z&'e S%vxʂ\e:(P=3mH!^Dv=]Tb`1m. ~.L#AGQWP].gf,)ai[H>͆ƪp(OA¦~tfD#F AH$9"+$ Qſ5  q,pbl1%t@[*zYX=Ird` f1$.J|Ctz\J{eNk / oiYM O%_d᭟Þ 4=|{zRZM|u2^C쌼k1 G {K<9 $N xq$;TAo8$J ļasb6UHiO6H@* tŠ)#[  RM.6QCb2H^Q)i&A" x`dpGxУI$ v5 ,jj Hbe, xa)dGa_kټ/9-ZB)$u>d&9r.\#vrH1$ܑ {]c<%Ot!X-haCTx$S3/7\>Năs= CҖE.+;D0λgu5MAY"l >Di9~i֌4bo0 H'HU,sIrɟP lLΩ?4>ުy#HE1ٮ\#t+ .ftCx; h+a鷸:RV'LodhJ2@3:-pʜ`#֪ $(d`Sa\iI\($8!k7\dD R):ֳi l"&A› 1\93!'L`kT]nnClwV'=D>V3\8,U*H,pxmspDoCᏟ+ǁE$S̱v'z^uQT_PPCm~_$ r* $aE i;Dq DhPOYNq Yųp^U|f6S ^|ch7tI@8I}I?!SIp·ZPh/^*dn:5bf[ M@|$Gj֮{ysb\=5HۺX@j#2l|I *l)+޳Auni=6BEk$3v"kU޵*l9< UlڵDawh8x~ȶk1 O]O;ęDVaVWشx<* mF GB] 7[M`-ZH9UUH4w02H=N_RpnFSL.$pW<܃x4KaP hZߨt$9e ~L(n3RlP[R` X=[= ޳$o94$)VHs IeI_Fwvn>oxŀ2m|~R5]i+TҐYa#+DT>-H NeD*؃WMtNg﫵I>&ۉ6 q!Ͳk@ @[0W/G[iB4}DڞMaM-qi:4f@i6qbwAf==RgGۙNjw@ңkVgYQqpn&P^Y MQļ\Q M/뒃7._ëe ,yo>=Cn 4=ÖK¦HU:Z6V{6ye5t/l0u3kEsP;v}4I̫ #UݗnlIP0Zm:Q{#H55֨ۦ׻|d#m#Ak[N2(&oi6$b8j8NS' f}Z/68b/=ƹ㌷pxi;P2̝=;Wҕ qf Yo8b0`a숢{69SO>e /|is0J)Ľ"!,B*/nJLþyi+X3_/ ~{iUQ4ͯWo3raKig$`oԫ=.l 6ɑi5x/Oi;QVJ-+p^G ^zޘ*%֨$ٷΙQK ꨉe "xr{fh8"$It~Ѧ+_Y@a~OTR,\<0x ${^A;@2ِ Km10-GF7!_GX dp||;%dͼ1 AE LB/!GYxV,Glv~@Zs@`M7^wk&,@bDZ@G ##y /lꜸ6\9ic;|f3l"M].ќep$`71em \ i!s|3p_e|~#b^;2$e~A{0}:>d"⋳:Օ 8@rljFr%vi` B$\T z6@2Eb<~ 4(Vmn@"v 2p }a9P*c™@v-l)#I8𯼦 %2rI>c/DNO߳ަ]NW|;5Axk mKPp!^G"~Zr lAg,PGC?ӁیهGuG|[00|e1ٚ=.C\giBPGkH$mKa8*bH,)/9,A@` %ylF`2E )f ͑ArKy Oj$G$BSus0ܒg' -)b4m,3 z g4RJ`7vFa`mG#IJx,u8IZ)nYU:G,b?Ź!]LqƠ69rS?Aľ3>< , 00UxAB쒘rH4$]n< \뾗lxs?Pφ|+aM$ gy S{z# !#ǾnA.IȣT.I uP\R92HKH4Ā`x$ch'`EIJڈXt8H09O qnQY=o6'`$MIhfEӁd@RV0j/% ̠`c@Zrj'# ݻɱ  @o=*B:-۰GYr}j`QφWPDz6d~EIB{/Wh@w e4`]&k۬|5VFQ`6C;o#C9¦R5b)t q5O8)31LYdH6K)rd c$icIs5 &b$l2 샍@ 8HҩSϐ(wHrdHZhP(~0חP`Ʒ)bAJGF kKCҦn5C={ՏQn{H"$3OGqz6E |gCR^GE6wϙ}h?<B;hcGJЍ|ݬr$̳< +?;0띮֔BG*ʼnm34vZ8&JGZ>N\}*Ne:LөDgbb|Ecѕ2s̷>_||Y& UP/IUl>-GrsIg; 3~3]Ű_ 6vc\XEK$߬y$x#[綈d D~:r l }ՆQ< Gt+@:x7 qdEJ*oIѩw瘊ir! .0m0#,(UPm6Qh\x2!Y2d&bͺuc$ m ] ֖z6,N5neMeΎ-;| L6 zudC:m)gɼ]~ SɘwNr}0Iy!F#2<)AHx\[ *p֐Rf5XG!]B^uЀx<^7gs~j7 Y?&d=@i^HB"MFųvƹq!9.a#0lMX56Aze+%哃 -FrE$őqPd9M6Ӛe˖ dO ɆWJ 5(=խPl&v=>JdzgYlXljm:ܸh\ Kv\haw?> _Tׇ/;uo$N_.u!1@Iy#a? jLN)>!n+6$Ä,@jߐ"u1$4B_EưF.*Aim SNRutR6f,(iJPx B `ND-3Z;8Bl(3@2/ZK e>,C!IgQ vLDkWL#O'A/ cH!@$=̄V)Jj+:;s9Q}Xhrdrr$Y/ܱ9HTI$ gv"a4it=@!nU8D1Fm \"4FMHJåwHiEDvT9j*5GBzW,[VK$G- 92)rⰔ'ݝ&.#]ەWdK7tc\n=Hx OÿHMhu?(VwVGRDzCLbݠ#) ~]9 sj$( IC*}8FK^Dd4yzѪ %Gffh¢U 5ozL==v@I}}p>R!: :E间pH|wy!L+wT:~Dp$IH |np4H S$uRvΊ3$N#Hx(FM{( ;H8Fp$I&~fK7ۉmvX{FsY#r3x ZH6V^6I8#%n2 I}i∲wQXlX|D\$ClXBx8U3ee4a]׷>W؏|vSwJ J##I#KUć8I@*;Miw*,Zt RMSio,NPh|HjrY2O+OsjG;Hh$VQx"% njj)t%+ܖ}r- W>sφ'~ $]axSٳN4_h.sȳ=*刱{.`yayU^jT;Rpd^oHAZMm xҴ5 r(#sڋT u1{<$$KKtI>[k,̥#@pg67`TÚ:W0翴#y/5) eo1w0g{Xj' ȮbVhsU 鶙{Eh! mܴڴ7hx?мL@14EJ:hKV mWfrH0P_Uu[A(UGt.*"OIZ6#`8ѵTJA nw飕+WN uz9pW0Ԯ:" `LݱoH67=-H#qeFmXmlI,}=mBa=dFApJE}?l[=.QznnT*H;KR<%ͭkVNm2a K!!ODg NK" H7^t)в|llʱ-s}sbs!CmPe[qٞDs6@7۩$T/FH(\FPOOK\@*2G ih+zm'q ;d$v˭gGV} ۽cZiI3(Lb[lEH.i33#LeҎn(v+he'YZ_W M(/U;lܱbm0*-xH  6Q·R8 eRCalɅ Y( ݃jaNQa)\;6xl#y||۸?1<.7/dwt 4TdMF%ͷae:̚Kw@qT8@h!6|8u\,Ro+=C#0H(hNH `uvWnq.5hv׭>1kN;HJ>؊լJt3Q0z}q0-3FIluu8\] !d ;Q*ȇGR \r2wSh<ـq*8E<8b<3tQ]_6>//]d KK408e۳K3=&[@i#xG 4Vi@uOГHH n Nm0U0RhHC9A`QI@҉Nc=!rBJ!ơL^T`@Z{E'b%UN l+ủ `{h:UnDͽ+W [f*[~PK!m01 |n)ؐQ"VU V8(@PށAJdl qA8ܒ@%$l$BUqSJxгÜ  .#|Nk'd3} $d f$kـi q oR3oɀ:]x ]d,k>l mǽu4pB {)#$Z0"HO +=+1ɉ$؛"5ldݺ!7ۿsk^_GZtH^&Pii G]lwb I|lLFE&`0V2(z~׮?]7rM9?Ove\(C;:qy)WU$ֳD"NгvO=|kȡtlH}[;$ ls~CC3Eܘl|/?<35ͷm<$l@Xh FŐ*`kJ׼/A  Xdo= ]_?^I=HǟA <9A?/nOo퐹j$j5#$}jZXvМډu7]λjK_nNJx@)LTOL|nǿ۰{+]gfwf d/f`/ nt6nsdCl,Om z0 >m^Tn!l-=7]"@܇3 -K7)Z-oGٱ]F֍[ԨU!cZۈhPAGw-;g[vxьOg$m?/ŗ0 Fm&r!3].H&us1-gxy~sg3va<93&S\o#B6&&&8AV̚sVI:dX&Zniܥ?4:,]_4g/b (Ss9|Yg}spml U/ZZHÅ&tCtBn r~jZNT;c1FP7x]HU̅8G/ZʇnDmnĉHcc N t ";m ֜8ms/:%}u dU})l*5Җɜ¶z҆!#}:wHW;cph޴#8f%iB0z 609 Uz=tW4U=|H;Nl@nE (XZz ZAI P;w90XweHg -| l{3Mm 8-aRV4QKKc@Wt@AK+@0Dʆ`-I !s}kT"a Rs_" %|ޱţ>_<ihuwYs'RNk>58mQoͶ- dsVԁ>D": F:M=}>/''igӼH‹">/egwkbqʳ"xPv*wt%A2lQ/ms<kbw7ZaB3w}}oͱL*i !5s^N$- -NNH:hKIVG 06g ylTZ氢%lX|G0:pnٜYpDb̰NL%I1BY"Weqң$ᴀ 9l&dPS>67V[mbS'}DF:'疝~ jiܬ]uF`ܴF RTjIHHmXmx'\ ;^_Y$EIU|-zv4,f}\+ Ǽnux+5ە۶]0̶Y&$F$ 5u-98[(;sDyñe%qEՉ$ 1AHg3gsMᕝ1$'-/CkGmsdClj| rnm/q~oܧfgPT5W%4bߨD((r{{sd# ty0_-k'hѪzp(2[9M`Asv=gN$/O@l!-41Zy[uV:RrQ]Fo'$v $;4P[$Do\}+_ 恖 'wV%# |Ѫ>j;n+1s2*H뭄Q^/F!hfE CQ dkv a8QaPo9{RcR;MrOӗQU/R5 Y6g&6(=۳uQ<? wLdjDӢlDڝm <@JBii`O/0gmלQx|p<(`RltmF*B^Dt(膛p v9>Hӕߝ{Z$(4KU6=ۭ1W12(jPPN']wȠT{ma K-pf8S g#3 Ru]y6{a9VlTd*ewAMrL]4+2y.xߊZCεy0eƼ rhBk t Z[[֖hKk,:@wU[keelPvЃיZg{7:\: \ QS\n؄8Dt7>N>H@_h$Wq!LP1 $|@Z-ùi YK֋W5t)<HaW_~E}Xuֿp6CVe}tܬVY5ECb%(8b-010 ` wtPq> l "} M!,r ɽ'<>END1D;!^hDWVp0`,aiQd @סnslQpc^[=\O7K[&/EC>czL) M(| >=Gm(ɺ'gsf'ÎZSo푲L҃45M!iFĬ %-\[p- O)PHGkvIYj$ |MvĹBί!@:/{s UBB$#T*@&1蛃mJZ F)pMq.}$JxV3gûlv#)Ci l0c)ڳaMojn &_ 6.b ]kob @qI .w # `ɊR.J\. z.%H(=ɓ3@b_bU%qiv{T< -IiZHHx"?A}͊J/˪RteLӭ$aevQTY%L٤Qk,YwڤNRg1y$HqHu_NNH'%H12hg2HRHF5僴hф'A1|<7 v.&90p5Q2i1Rq Am]lh5H%oT2U ![}/?p0r|(i?جݜhGoGg:x;sH[?h}. $,P50{:V(pNGw y7+z .618bGؤ7!zص_ ̒*pCaxEZ$Eh4Gq1Aٝ_ř@SWЖ B_AR ~@4U_ݭQ@*qؘqmpH}$=RՉ#FXQZ$('j5H M&9vLRG( K+A: s<1:%HHK fSQ[/x޻}?ˡϽ3ЮvHIgbsgQ3{2x-kvnaڹf RH(0 %וpv $:6T IwO;0T C%{c58j͓"ޕrk@J.t݆P'c 0rk r50JsixKk\h#UP.(Ju7߈NDLMɈ0۲!#7FQ1fӍ5ѰVA4 V99{o C藶m{m刺9vF M=tt<*H@P@ȍ }PR@nQiD8Gx!,V6o;@GkVSzrBnM!GZHBy$}hL]FG$dx$GHR L%;;vh`Cns{z[ ) tdaY?\zuܹsWPwug4Hw)}%tɶt,e?-R$UE {7]e}B𨩴u !lԁ$ lDjd"<++H p>dE8>'$@"&-3Dzxf$s )>.GBcZHHs4@ʢX!+wկ$ 4ߨ `"i<9I`9j-qSp٢-@ &⑝ܟI=×>/ރeW7 $8HI`dH(jN6xSM@Cl T"ڭWHVsdW!M$WP!@jHh)v&"Gh3v$Bpޱ՚^PP5WAJvɷ]ai2d{HR X.Sic26F)PC6 GҨwIe K\]ܢs֯=P2 tx#e$y<$S4N L$]Cu+B+vHqqK -k7`HHY( /uj`7 K"@rH^t!2)ߌن4G'Ԭ@b@:vW$!@"!0{O\9|=!Q,R:Zh !37EEvuW$U}:0"V_5/qHXbz !Z$qd aFƑ 8 !2Ȧ%JZHVeibg)à-K_Џ?OMtfQA0rYyLv[[M$Bn $T~ $RUj Fm$RdHu!(i .IVH# Q̄I8r9n'T W=89v%9H ʬf ;Ho: ӹZhʐ :E"KX)aBX;4ҙ.@+}*H@39 =\ybH.KQ#oo\]wE"|dwVD=K]4H ,8vB!?6gdB{F+y#iRAP8H5#֏b &B0.z{vPydN"2{=cv@ b7{\evi%H$H$%>-FWCT?R߉5|_ѡW^}rγ_.ޣUwtR:+p!V T@HvkݹIMoI8G$6iI#h֑$bb<eZbɤ6AJ^U|tf6/w2r;AY~  `{s:ϒ[W% ׂ[)(*vyqu6NEME IHIvȊڭ1zOWgH}zݯi pYGqW"dqUvC`Ii@Hj}S-:dcXXDv2.eS-'H@i'n9Y(o.mQS5ѥtmEve"]R$W ㎯i9.X1O(}Vz0-vSh7IB7.ҍH^H) Jet(Ϸi P͋(- o~1+@҆j%% AHHDH|4lZ#@2<5tD;S$?3Km#E˿]l]Bg!cHg.V sV7hjr%GH^"IwjoU4Hl[l_* \ RǏ"D62Th# 5W<@]K6@o S;_c $A H5X?!@*UpWrJ;/)C*k9A$Wv,VzP*{sE-fѪ\$0)^"}ϻ~]<)'pΈz3,.Z7%C$atU:E{ڳ('>shU濋$ Ge[; R!- }7w〄9Ջ}ek%&!TkA^ ,߾ɀٹ 6cuH#RXނfJnU|@ с$y?W(;ši>h@ re:5]cXEŘgkպJS7dA N" ڏ-T]kE3]yoFA$m)F .= #۸A+'IzIM*@t\/]v 5 1HHK vee Az3HnA jJI0QvDΖ5,-p˞`Af *@"wv<\Lȉ b|`_lu#9HX3?cfZ]'[MҌ"!Sp븁.ITC}6_I1#3#seK\&ە6lH6jjjL$ ho.MfʹHc Q!L:mz]fhz?= k:$vƟà:+(k,a6!Qin O}\wlkkjzԟ_T#unmQl`!JMߊeJJ_*^9 Ghp- }Ʊ0ⳟ~)wJyZ@9%ŚK}[ȗGY.,|_FM6 NG>0?el'LDnO6:6LJM6 O6rS$924$`΄P_O3[2+Rzh9K57.>|vRSOMYr0?EwI626#$c6Mk:Lg0(bۈб^/DZ/-5;&;9bgt$lxi;=c|###Svmo~Cfg#̮%l|؟$=e3,T6,/v ^S AŞIK7KJz\ʕ))-Dž7󠲍i{o3)xed3hm .6%v踔bO)_fMx{X)}tz=v9c [$F9oۍɽHxeכgDc}¦<&;Iog m|,f !Agb0qXDkx{[/x{??걿(pRc⁝ zLGHXx[;wFv_9ऊ6B‘VO{OA!!+.!6Hc/Xlmne#FwL/lIGk8ĹHO#O^&cB"k !! \r 'D\I./‹DRD)R:"tA)ʋs7G4Բٵg Ύ_ofCCáֶJJ5BNH O PBsW '%mOnSǃ8偬BFO{]q|(R8=IG{~1W:";:lB7]}C:`;2v}ס圸g?rFѓYgÙS ($lqݳj!M\ 5# >hyv{$I>x@WVejgN4ނ(I s]-.q?:RSH~!q{ qvvbщ71킝7d)UI$R:=c яiZQ+FBZ7i))8:.B\ ì0Gg ]y :}=2AHBHn򒪊(pЁ76%?y#qz\4 @* )s\r,. /C$6P>dsjt֌p̎5˕) ζSA:l8/`ϥ\fn+uz ځR֍ٹ.5S1b;pFnaXZYBsPIs>59p\aNr(p18\LTN/dA::?LK޳0dwGQC!ўv!cwRSc{wXIme~+1)[HFO<^cIk2,$6^0He4<t.i1&LBZiһwR7nrURې^wg K'@uiؕ,ݿI/9nt*‘UIe(v~MO(陧G|9ۖvhR˾4=ozBG<:BI-Kݎ_Qk{!=?G:D f7!= J%i~ ʕ66w<1["R7̎G$?W2xj,4ӵCwNQcaG< =N5\9pqnbSwܧb\院V^QLX&T>Rgz|*)s"{ΆlRzqNk0n*N䀒-/8Qهғˀ>ap+nd{RH 8Y!=_ vS̙3ݸcq >Ԭ$QkXW'Uv6 @dy/wf ;[&"[r opX|H;E}!a "S%mARO6Bqc99Q;ypzc4^l#a T z(f-vD\P. 3˾]ϋgT*MB@KgC_[8毣 K+qfl͛ǵXi?Cng}p\hYa]x#-ynOfd~!6j:^ABIվd)K9;--2z8i;$WX;LcTϏNpyP碣Y:'q R7yTgP/Ud0(F4 ҇l/Fc| 0(DIB# B+ |h֓KP;Ͻy-9s;cKcf:oaW py)R~:*?E5Ol<}+x"k|4!GZ:7]R*k!ff! -%ҥ#G<: Om_tٻ߯8Y'MVU밞pXSpd}Yj@k'It߄Z^c.ߟ9'> 2p|eM!;+pآ],vpq`b/FAs*m%I(JHkY[PVGa@q<|w{o#B#|j;twk?1&qϖYp!E> Nk##{VF 5FQ*!u,?\S!@H^)J H@W3;ugyD`/˿A>[-m}[wz`g5OQJ(8-2R&Q H#τWŽ!.alp} ÇDB;Kl;1\W\}o*K1HȥR)J$ZZ )RZbze-gNqNjhG UB._7 i?989h LP{gÔ$GVƎvpOp$J4GF&syLbcڊ{h5 {edt^ug-sh!6YshncHי?s,wשn .upˮlk\tBZ2t4iQO:BJ! )U}u $;@JXvϲcش8υŗ=f.K'#ʎ`\@&`/٤W>kNZ@+plj3Ɋ[`S؜KJRdedT,G圛lV }|yNpcn[e̩\nP$:2H8OÏ'ѓоk.ښ&9;1#R^M8)%Md4 Rn3SY|x\QVz \FBY 'oHrHi+}_ӾV\ mVoq!ss$YBT\,"L&m,E8cNw$9)o4RaRtf) ulD'jct7 8QEMHRx88\6YgnGuzOBBn+:]q6*5+ d}u/xƜ/IOʥ}  Xr#SiWNr_I=d'~250 Jk7R&y˓"4Eą4Ruē,.8ˇ!HHCKy:2ҁ#`PƁ]Xm >$܈pHj}xs=#9}]쭷>oSy<kAV)ǁa"6^+tσ?mv,]1iټ|g̕"; q/Js3ssjyNx^ f :B6={gbNăJ=-H9f)<ɯt݉A"O}lW*ܠ#<5PיP}?K NC]v>ow=qaB൦$}:8ۇ9Ws)(:ГYk ܱny8C?-[ vpBZyB21:16IfR{{$\++w pǻ"TRP\H<ħ}b $ ó#!;{BUus =;S۫vm6V y&pM0î8uq6\ws:R)25mE6L\X-kbsVhy1p$fC3P]Ck4zD~bGuwA 5nڑ ɱ-2XHKft-\ %K)B b$^ÁBJ%OBV8yqj=4įyuc 5>l}(ZŅrv@Xs\ wHQ pH57BK!bEЏyrMƠ2ȴNKγㅔ jAH͆D++Qj9uEUw,/lTQO !\ۯvI?P}YquvNwsTn%w2t{J.Q6rJ3wO7-r.o/rdos/KaT'! RPrN-haAr'%z^ Dž8 %B*)|R"$ 9Tu6)g(']r>p0-t;nYT7B5uPvLuL;oz6v<tx!$I!# `rZr# >"Քryq\JT쓽B  `:[Hk/-#yC.̻}7ŻأK}THc*$[|ةͭM舄f'\ћY+8筭qYfYѯA62+za-k0$n7p!!OY$͏8DY=¥O]n$定!Ry5tCG2r9j(eB5T{"$j9ZMLԬ0Oko apTC3BS53DVu08,Twxa,7^AĂj*,/8 ߲r!e('DPKjrZr-R i_H=/^P=ТHEBh IH>O0$$RuS(/D+U)'tiO\Cw''x&FIi!:v4Tn-x[k!Ų#4́DObpbH %pfەhnͮ6lk58`) (s*E<Ҵ\H .$Ѽ?y8_̀JYr]܈'Rg ۅ")Z^EQЈCF3z_㿈oU'koO옳2 X1w} :CH ClV;sbs(9Ik&rHZ~;85o/ޮ-ƅ( fLeҺ5XBlHI<`W6qhUD .5Rd".}ʫ&RTx(9s5J[3Sۙo.?3f*c^S oSш6ق0>/99j!$OeӪdB"TՃdB"PdBpv 3%y'pNb9 <s횾OBBa~$t iy a}^#)?k !u>nK_ ;Wi!f{zCHeg !aFh'ږݏt[xw%K;_NYi+kW% >x0MGțĹI9dq/skS~irs^drNɭ|Q+hq 2U1ܟAH 1):&Jz4@'6=ł2ݍ"d|oq1!u&w-mڨk@nQ/l+<^1/#m"3!jB"8. IV+!q80!$b%m?pm B/~@X/yfJ|@|ʛ$ 24ȗ:@=#\JLvپN@I '>œCq!mbo˅۹q`>a5ss/\XwɡV+?x*j@Ƹ0i-NX:A0[E]Zd*oVq=t7{0=u +XUZ $  ÂqVQrnJ|sU[>c;*I83GB\J\wzNPBSMnn'N{]FˢN8,E(!R*M+=&DcЪF-R:BB%Bin-ƢUt$XV+ͅ pȅI5_L^PPutL c\) *n8hCap>IOXi`fў_uAAZg h`ƅq>ك\ԫs+]>4%-l Ɠ"zaLS~E#1%]sd8148bϋkBI%?9H))ɐրNe\*(d>;%cj7(+6VM~JرT\6{T:ڹkMҦdU/*m9]'N9G&Cb5fH7ai:u#"Evh4< qjh{H=kh]ۅv9y3%[B614Ne'H2'v'Rx7 +9HM80m,oym\lu/Hv[ l7(zHA:G|Sdݢ=Z]v^v6⺾6W΍}b |vZU;qeDj}thf?D[:#m)FTG{*A[kA,L> Jv K""f9 W8ďa*.]"(GC n `pdwr.H*Qp%r$\ysK 0> Wy:Ng_'{MGyU'Wp/Kuw r2yKn1a„}@țK=x / HrIHuP>k.퇦#ևy+Dj n"644yUW@i$ )yBr.CKnn؇ Aw+p{pxpEN̘@ׇۤOoadG5aId`KYo){L89mojy(qTNh_ jfռfٷ+4x@z8sMH.)I =x 6!$<9+ 0wn6dt ??y0nk:" 3hnB8Q!@Ĥ|afa+ &(.bHB%;ww]Ȟ?{Ƿ {;9j?O]x xF<|p0@tD>s ܱ`lK=ܻtDı1[\՟H;94_ZA;#iG+5:&=`qQl`0@Ph̥\3\=& 3G4djܵ IZ'cMHغ&oV$`꣗%>zH^1_"9o)LN9mI[ %=hq(HHR(Ny ecÁy79-<&&<-yȫEU`CAzޡaJ柧v0=GI1yͦ_76a*>fdX :Y3 4P5e0tvNa6̞2-HıW 0U6̟& oC U.j iwUĻCw+e&O!Bl DMh.*Jw|s"Oiׯiu׭G%W[}uBrr2GJR/dDT* r"el-,hi {=ʠULq"H$JrR&<2H;OS8\[7^+>i[貞,zj5}K:V}3dzI3Ay]!U aKm8vsGcҗ`ҝ:M03=sFzFGGpoۇ?ri} !"=LZ_d8 2P";a^pc|4|JLP"6?|玎 (ܩ *Sq{%}duo2̔%|sNӧ!zfZ+#ۙpdu9zI飾FtOKMn M" HYn2}l7vwӘ2F(")B|oTïK<*@E`9f@o r@O)9vO"P!) 14${DMg 1 Y/&q;n$n |g"~Y |eqxIh%=Jots6RFJΔ 15k<^ܕnAO Ψeڲ(y-=j^<)k\&1\ B$`=B[nGD.آP(ҚCl IKK[\--]hIZt@|KC8f7ܹ[n'׭{?ݷ-5u}egOVi4VBH}0USSn;;]Db2Nsnׇ`s_36ޞ)-B4?"!@M u=`N<\bR c%x%g*=ؤ74$`HSr:$ꑚ_rYOHPk)}שؤVQOMfz4~OX[3ڇAf`- [FT A@"vƈv.pΔuL\v31rLbMtig>P51!x%v\f"M%bC:d7tvux0?_OERcJ0U#i-[FBAkX?\& 7䍛B=fCHjg" `ޮ.rQ\ۖni,|V[YCBkxx-%KGnMա/"$A<Ǻ Q={9cd樆] cyD_,ZPgEU2h^HoA^- C0qÆ v,KcwW`VG,M]d1`Ybk#ۖb\-e'ԊZ51Q2lPGʧv|y:=dg/Q˔QO,JS66#.҂ =f ,-g36["i$Zcx}t6OoJ"o2y6Ejs szCljĂٓ  HLJ#3~۳b5A$첓R;H Ǐ/nhhT`+suΓ)bw>2c-3Ѯ+ lI ]+l:+X[bt9^~epFFU3:vOAJ}k;ο|kw{Fp")msew/6ٌR&?|-H&b z|j EY,"&ap^ށGB\UH&)y{&'#F 1IVA5Ivvpé4Pr%gW蚽w/b~WRɀ?7ƒqv/, ڵ>vY76"Fz}D$lB!0E|O¥d)8O%yy,rO.يUAqqGzz$"q ys9;T33x=嗬3%=%=ܳ{j5]`w5ړ"K4|r)E9w=1E$'WX|@R[HN+,8L4/+\"@2žC>L "T@h_Krb<1SvАͮx)K~+ 0M,ݪ ,<֚G#VEdz@YޕZĉ $"[Ը1`w0<|lz" A/D6T m"܆A/U2gG£Rzz gO0p IHL)PJC hȱ>l&"JZcр&8wɟ9i5}ģi@$bnks7cK "JQ{S>ED$d2Ҫ, `)h >7`Ҫ2Ɏlæx67 {kqbfzJ\/&@*hͩ)3ô&K oVZL\]|UJ kIQ kܓF?Ns5Z$ˑ,M\;P?Uw@З^tZK DGL(f#LDZ VW/\ a3ѨHI pa>elkhR\D F4Ix) ɼQɛ>ޖ^J'ҿ #kƐVItz/03ipǦ$Lj*xϘWȗ廧+"Z ?AP#G(i"E+ZLYVn)Pǯ^]#t"}8hBg6!dV+Ҟ,E:È?-0$n`՚"]+sZ]?xFD @#́d<07} q5L ɴzIe3葆)H?,!e+x0t I޶9@:萉x1~i/VzJ*NO鵵Ro؋uCA҈~~?cF4BE(R==9\W3VJgQ.}9wO9c!VHUu[n:ۢ"Sv''*I%m}:kEPiUЙ1k +,,IҸ󾓈ES ڧK0W2eEHUwJ,y_dpLLpJJ<^7.Є7L;]%5DZvڙUEaaE:hm#Q+E8~MB@\ėۄX~9{9gsƮxX#1N|y_qU$%`|_PO,.WE|VT˳fjbzMJ)8Rhe 6} 6^,Y7Wf?gk''y"bRH =+VK^#(#j6C?  =KtٿLR~HH#^A4 #H*eր|TG8siR=${ilw߽N~}x +kk>fEplROU;|Y=a,כ#,"ZB?aLjh@|-\6G:@Bad^ X/bu38Hoe ?3$lNΧ;%Ht)>^[rodsX SlDY>r-qq޲lR}:9y}z\$RȯHHԴ};@B^,e}m+"6l0R0JˊIeYц,&;`jB|,w^kf|qy(+_!fdtmHZ;L!_PqY.V E[=~=I1k1t D ѻQ ({ێmŃpnxf4336g|}(i%'#=8!䡡wbe6$48x{^"E9`BɸA=>2/|aFᚍ-Y }[;5; $CKq :{ z$t1{pJHZ*;} Ҋ Z L4$qt::ZW kkB եVZUk@:=$ B(lh PzfL7TY`y.`E%jS{ |52ެg_`*S# G$JlesOI{U=^{%b ہ ʖyL\B^~mP7ҡ=j}) vS,<c"*+ GWHA}06A%EΑJMS ggXV;xmxء@ۢT<1xp'4>1 \X׻>Cuw$ >, b&y tF7kBZ ~9rԱ=o%Hsݝ8uzǁ a>GPm|fH|9J~n## A:z.XgFWWzjlgQ\g0ɍ't@s3$RӠϿ!<  ]OD.g5?k8dđ(be"wh)-};vjGZ~~$IE,-!AB#+>Ym^]qRQr@:uS%HJ?Oٯ'b}ݧ֘ɱ3 bM?[$1ʤ.ZSu~Db7b(*GE w12 [#TdAL$LHƍy#w4u4cc0^767<; dvF){FK^|ųzg,8wg)\;7 tQgѨ6ܿVC/B~?QkD6~?P~\ A Ry$HMj_ݎpVkGL\,R&g R .^boMCB&V=?04_вLizY R![-6w r#·Ւzdfhܧ;@:[Pf)٬$%0޸zz:@*(hѬc ;#uhdbbڄ#X*` I1 ǩ%lN fYgY > v{#jX1fZ1m\Ě>R8H3o ě>CIil҆Łt9$~޳R\>vH r+Rs+T+ 4~Lc G$ 8~nCN"`-ugx $}l`q>d>I!>4t p[ʨFr3, h9e*~c %A>qĬ-T.\h32Ԩ/_lO(W(*ZFJ9D0Ttr("|\%@$yE~,$AJ<nU` ˨@4L bœk'ԁ¦xi+MG WHBkV U"9H4Cpvoq+l5EgIZbYdҟ`,hjTIA>w2nn.`ZȖiQ]I͓*Y:RF cJƤpMeAꫡ]j~]#밽Qߧ"֯w Q6'H >޹ @n] MܵyʼIu$_p2Hؐ3|T N EhwpsB1=~U 8HLMN0  !k6 p6 h$A"s̆BfM, | Z R`I_:AZI TA:H9 9 '= ITjPYG5D$I2#'ф_ 68a|!'#}Gfc-'GPz﹀=_GM~_GGȦF<%CƑ@gY2x Rb %.^LvI <Mu-@b$|f nD`a|~c47u+^G1`6 '1d >"t{BW6, GH@H: 4w[#\;z,@ XjώH$- (uHTLY"LDwKܢYho8/9-`@$ZjZH1{8Hv47l" Q)ܦ͑JlXY׻yiIVddvXNxÁ3NVcttAqA"|$Ilѿ #Ǯ ԔNUMa9w5-#C&SgSS_ 73Ifx)'HR(2RgeZ:U.O@%f9X{p6?cV߻} {rجI } {ͺ&Ճ́ PyɾȞ^=7sR\CY66{ aLq/0$b$a$A10$|A*E7MdC/>"]ʝ{v)J-$$HXEI~MAiLf ;|odPbv!!T= .X&'HQ 1nE; dZ+3 .U;/X}]?/E4ce:9j*IQ<^'Aj8USW;iص|Cވ/譼!K)k$I3K*ͬ n  e33icd~Ii  &n 06N~/};pY/vd!x(s$r@=ɉ  iYȀP!A"I)B"RoA<~`G8 >YSkwP{I,hv a DW.ϵ3ao< M&B*?4u`dYoyVY<( R9 tۯRSlhCԤ{HrԈ7zaHJLܥr'1 g'kjo;~S0}eniS~8&Nw@[? >if@c>f%=,a~'^7<p)ؒ"|}ґbz_b0Ɓ=) 3\llFj9HҵoRkrhBpbA#sK3onLZ=="io@$];9I5$&)|u:IOEW_gzHOŎH| j8^;1 8GB{ehj9v._H<;25[E"#~1#$D*Gws[-d_2BdOQ仁"+J\U'WdU=+n#Wګ/~ķnGb( bic4wѨ nOZ/ B(WH)HzVDX*Xv|`&H\ɪY2;++MJhLNiSEm6_)QAуVwIؕx|TT0BscȨ(6@PmċZnf)|c}&'`_P#eaZF2].8:`9$ W ͣo6yB80gmZnUƾ֎}.uc_y30U^{].9Z#c_8uljm5l[l$N#8  $HʓCZ>r (z#L1$"(]n!^5C|oE}9*ė̳Ƕ!qޜg(.JQHLD8hyJnDTOùdǩHw5]t~ Ib;x]cw;vc)ww_0|/?*mX*t*6SQY hBۤAR7d*SFE$fFg7H[q,n)b}m_ܞ]p=s_޼ɆͰ"Z} EM{;D FLڭ erd_Ė}sre${I)`R. {rY[P t!?C\M\B?z' #/;;^*UXhBH>vu0z{V}yH:P~1RwvnDr>YnUfT:[dȟhEpҶl_sO$ck׭f)Y@M*_*j[SZq(gS|Ml !u y\x{]`$h1&5ds%]3[JӶT[o]񕷫 7WN(LᑮE֠g׆+=L}5 l$6wtŊh۲bŖߟd؃HnIcKs+rSMJcݦjr:(q>ZRyĕ.TWJV^/U. ED7WkE'F"pcMTv:9~>|h˃_ "UAS }.E}w]9T.5-HQWO$ @]BoU&63D LF[{ Sw`y+mKͫWk6Kw-Ҷ 绛)/J Rj#YmJyA bЅ9QhRS&fjN}b`~L=GQD+ GgEI}Ú,t޷PxAh:(7j^j.H4݊Jפd?`τ~m)6Rl3):R0Y]ԭ:RyPY=Qz3u"Ǟtm|}|dx+ftGocZ69%%r>,a-Cw5H$ltU;4~]MZW*HdӞn]xrkgemWV$dkYlY*qxČУФt]VM s |GYC- $p$ 9]3ӣx4uq:K/\s1 e/,>b=zԛDb-vBv71umT9R5&F IF19=,,QW0鿰}ÀSQ7lPKذ]叱t!+-p4ի۽p5sx.6;gnI5_T686kTQ"IpGR₧ oiAR "l(fO%["U$%Wi) j {~(Բ p6( f!k03UWeAI6/ N7dKJ_;xKEfpīw~sKie0bfG' TB ZN%;w)z}%dcHJ4$ P4 h$ l N{a\z')"onjLQr2T1$'lGGm. y_)e6O{#q8,()iH@c߭&Y0D:ʆ8Gnb6:'vYIyC ֕ .ŁS)$CVv;Lϧ9j𴋒R q$@b$1тsqTJb5ȜH)^Ѿse)c:΁G?[tɒZ$ g;4aCضpw ^N_Azx21|z^6͹{ؑ#QFS 1Bҭ$[8GmAR_]mHd  AAt-X0a>pu!<!6G*+q/JrII2t9s _<ۤAj=CR#}=Ȯ/ՖeI ' I ["HüvmH9v&d[RWBLSC:9k8`$wI֊V !٥q̤!]۷D--Ϭu_X̖R/^AQ6,MBVj]O!;:6vرQwAEcq;VD<sO(2' TBҽG vmKo-gFZ5y(4d=_BMU2WBSJ|TTϻNR~, N' GTQ VnxRw#mI~v/?7+A $gxbZ[JɆҵvJ{HCpIϓ c;+9K;wF8Z|MUHqsc& ufLz;ӝl~k?4=M>y4{0PH8,2@*%}dG IN#$lyHP NbYhcGkJח"<1[XN+= 684(S%/6ni}$9R1yΆ>6܀ DR 0^Edr훨Iڶ$ PbEuDQ.4V 4G*n){ A>T6%Z[+֦h.p k,{ta+W%M?so]Q>b` ] {n"Cdُc t8 #ݿh vb,0C8AA'CIv,B:fO7h I 4$H#JRKuM$ma)F:hI\^d2:P]t[pF%vm0.Cxw:ҺHpb=Gmfaj IG g(m#n y3(F $~+AKH:$8:{=hP'RFnl4olej> $b HA}= kֈ_Jg $tUT_wK3mS? {Cbx,G* -^* XA~i_btH 6KDGu8Hm+(57I0%DA EP"H\uL=٘$G "`Vt7(v|O&T Y&RZ“9h@(# 6Lt&$z8H0 !πFxHН^{ು!; ,]Acq RAY;%H:pX$@)`)Y5<ʟs3(:($b{y~嶗u<~[ "y9P^Rd{0xB&.ܨ$ gT{r]C/{u ;s 6e/ U7A i&o 1=-AA藹%fȞ=eդlwYhQu4F93%Dh'sHG[G֨yC $v'v; <C!)cQHvpHCSh1";.~WZhNx'RC;Dvzh7N։N4C;F i;j~V]4dO% $Ry\:v7vcM8= Λ)[/Nf _P e)Q5;fpvfXPdc3zDO!`Y\ H1Am9i6$k>I YI-HH(eб x=d"yq׮9QF@@TtwWlvNI 8"D$ݭl`;-֒%Mo<95"z;,$ ) b~>B 8 eY B8%-a{")0= $ 䐠EV$Dna\{"@oy*.QFAR0!._qGY GqE^ƾ>D%fz e/Q|Zl!EF"E$rHzvUI4$=j ^m8Hq)$AuvEǾڽxm$JS`d5m5 ^<+r_3s5f[tp7zO% D+Ju؃c]7fIޑLe{<$w;ߧe^]=GvGS,߮::] ţhA6/|8)Pf ɬBggd9Üp vI]eYZO5 z;UU'D}P_/ $Hz$#-xߤ۴vk# $5i6(JH_GҤ!_}].5V )݂9K.WեKUu9ϡDU^~AvDΆdo킦_3S@,"݀.T* _4~"Yhz3&ىi]bAñ=U p::CU!'&9RHM/ȪgVЁӊ.QN[o!팖覢qWb|D@6Wh|/Jswv>oY}ߎ?F(|hr(ĬYhhP/\9G>1Caxa @1&:,'iuGw0 E38XrxGGQUUB3ƪJe7Fy5o聧_L}x9>= wFoK MxwLx>sbPHkz!jYCS)eW^&w=EV=ӍQҴB#{e4 qf R%ՉuX&9J h]iZ%eBVGˤUd24sCؐ:wuS;/*AJbKv c [c͉}>){ӘlrKSoTs([&=1Ƌvʨgtxˮ}}!ٴtvuTsvΐ~5\_x*0jVʸtx7c7mu}/1]p۷;M$]\un>nf:J/(uq*q^#nF;*P ΋*.ZQ!kӂBN `Ac Σ#9I\xTe"lͺle.mZ^gpHtխx散 %ͷن9--zmMS+ϾSa{357!.un0j|jA{Nw sI$v ~3O(D iB+"T'LWE)uȍn.IDT0^2{pvGsgf$[wE1)c?NkwQ:"k;h{Ơn23Ma`5xq0 Z4k^͒CEą%蚴joCizۅV|`َYW.SSĕ+Ok4;C[;9ش6-Y[[x]]$E ϥC^601m+w;6L,Pq`ⴞݷ~(G3ΟU]4{E9FK1JO uuI(AC TL< \2=)b `r,!`s 3ys][WW7W~iG45ߪGEk>q6YŚ)X5n6F":jn6>h\GrYg'D$T]M 숹<Q6ql cKC6T0aUm SWaO-Ih_LVl]amdDڌQ kU 3fl3m> 8}XIG$HgoF7 yFfMS_vC=t!\ v+~>oHSN$qx@'ڤ5 ů[mҊ.*fjVtN;#+a_}ݸAp[''YR^Za po x>ߚfazv=Hjc7f3}eWъ"{+|#P\ Rfqɀ)#Gnh 4Q)%C긟*;J' (:@ b8'H~|'H^sTSN+uc߽}Pi.on~sbճr'T;EQG_y`E :҉.#ىy!GG]a]]"&$>ΚF9A+}GJdo1Ǡ>deCI(:;$htc,ɑ6&wžq>i4"9MHF֓C޴: @*H5 )  Cx:  )o0,y%h}%ZIFG_=nDjoKIfvҢ Y 0U Xy٭|3F`Eb İ֞J\$նpZ 0L&;E bX41kDGJ[EvrkͬGYGGL"Otb>(9J@ʟI9D8!0I9A RIF.Aj0Im imNh mX9A" mb9ABn'H8v=p?`g ;DpR v e 0G$4cpK7h=:ߢY2]Z'zexy/֣ Cˆ<v;z+O:ks=fKҨ *lӎ7X،r;|Ǝ`GEEܪ"-5bjZ{Gލao8=aϟy>q`w/ЦބFNNVܽ~cެ6:\> [#N -R |T)~Ƃpaw(n 7-SX2ap?Exn[ӓ"B"K҂w4 WysX F$Hq8Ҩ)B)? $.b :180/J(4h10u1(B] S25 *0AQ1:<^S>OpKфM\p4qd)"8ZE &K!ћb!dh#z`I= Y*֠.%;/H_k2m߿3;E[}q&ͩߤE#;iLhg-*A{tu2Z'KɃ ; :t 0=6f1H;B?q8bJnQ^N(Grb7@RHt^ X{W Vn) J%@&I^oZy#zRy*]G0B@2}`x&Z#tRx Gp$>)簎nE@UF2F6Itw$͒#i GơG#RA9%ZGudȝ8c#iQhӚK,-s^pЂ7l#.s## vpܬ1!xnGvw@j)]5^vexX&H<9lͩݭ'^`~E.Á~SI . P 6GdYE Fa*rg4&#w Zk\)鎦 hCi4(P &#450Sh $ezf݊AHr#9V`d[ed_yskU* dΡIv Dy9t'J`P.>3i{駿yǖiT>%3-Y". nw-@]m$e.ц[QZ 1&Hl؈ΜU JQ,7ʱ[օh L'yI+TNz$ɼ5~6/Iɼ< H.9@"vMh `GG $/8m\h x(#nOY 8>`[Vn[Qn\u?,ƨ %p%@F`$5Ӓ^ʁ` ,A`t ǝXҲ[Cva/7ӱi\ҲB?PnUQaYRÒ?b54H#2]A#Z ?Uu+LFUf^3^u+t3^u+:VtK|Ь^ ۪v:Jcr4`Ւ i#]_\; }fk*+MBZP\ 68iahPs҉m&tU}zm=H!KN ہ$plu5Mi8b$&w}IHڈJ}W,}vI[a o(Ad] dHiL 48V4ku+4G H)Vxˏ"m[#v#mrnahfحZ5 ].ؙh]ܿ3H]v|n_~r)\تK-G 9g)4̃qh9kbhs6COjVCPzH^n/w$!m֐yDVܲM:9M+Em${6>je枳CvptH:i46BvƃжRaW++fX'nnl벸B>lo{Qi4;[@K9A" HYI'H GurՓ;L⋯a/~(x`R/lzo{z>qXфr/үtPUc- Zz:/Jުmj֬vdClL|/D_EXؿ2NN~)~i7@"0 D=Ю9VhX3 ŋS+146otm ҾK^zil**?G!* O;kN~\U^k#U#R㽳t6mӐkYo`pca,*E0E gHݿ9B0tU:SiK4S # ̑\Q7TJCJK[P,$UŤ`+S)AG-I18]Z3ISc1&(lpG 32MQ׭N#j1H$A(99ݝ f@(ۦ{ HזַH4 7pAˑ mBay& y XO+ris^qz2RDOn*n|Ýr5M3[ߑ8{'-<ʪ^_y_W̪}[![ >d!jhlg8 ɢ>kƂcԀU zv[V-ZHWEe~5+aD $3ڵ;խU w+pYZv9l(<ҳ&A{"t.턩͂rvvFuw3?jn/IwòkHG Z:=JEs{)kA "ߝ5չϥ্̍K&"`l%2A)6snU7vak{nct~lhKc9&~J]XEX;ēXAe-~(DſϚ!3~j f5''/:P="+\@tzFe7 d%9wNd:(:'ag"(Bm^;==e<bc'h +j/Wa@SRh?kzMś(1 8|# LjvR i/WށiڀsUA5ʒ;& F{+s- ΊGr7o~\ըˤɌyYUѥU`gI5StӆX];v"_F˼^0GNQPmaތチZJE n 1y8GڡÍe'uw} c5bw6na/1* ݳSeaPQ`>Y>9wB4 *ՎqQR̈^\:Œ݃cMo2eΗoX`T`Q ^=sTh`]?c̑O"O;/_\x$MIp}v6k_$YticzYby,ܸ J.UuNH&|x{c<{w(fOv}~ ܓee.1F݃T 55|+n YnFrMp Y¾(y1 &cϤCGTLrl:ʢՙ,΢aY< R%|\gIzܜ`ʢ};c"&3e4^6*n6AE)Q.|J@>W'tc\IT,L@5y@G`$ FBF0W7N:_ RJobXG+yKK/"6ijv?R}/`8pK?/,*yh7~:a#pdgk5K7  婷h'OM~[FXQGs&Y`kőRpT4(Du Epܢv<aew(qj"M#mtO-,迳~xh1x`d`1tYnf}y1fJ@#!g+ FB`ӽ&r%o0|O]dm懕')``j #& ? RywC!Vpf:{^~̐Z<2iRR_b?CەTsqk--|bq^*,)\N^hLr**!olK=6=.n"p5UKGxx s:x$!Lm&Kуed.SnwdHtzLXE;4ZFMT/H6»2no1=pz:Ű3}̤uV$Y,! SY?E{߁c~Ń2_g^Ibe6s/ [:ɢUGј\t{Pdi;Æ५yP-pg+[F*}dm)J?, |ഖoHHl+BF*_ v(Gb XIo~W}³?:&l2FV fHޣ-2wZщ)SK#&kw`kZ?OlM%VpwIC㋡wJa)Mm8/znѱ{D 0}LG=ע?OE5PH? :"' P[كק5==룔RY\~)+>X >̪`w^gpOv?$Ɨ ~)d@|/5bo&沂o-Z)~Xb?OOR:`#!H1L"IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/no_avatar.png0000644000175600017570000000115512672631600026622 0ustar pravipraviPNG  IHDRKK%%64IDATxߊ1S, ֙ 0YT0gyVC$鞳h>˅7~l擖mu5Xm-ղ5bIʓakſQ,e1 VcwU!)g阥qY gcgN(Ye jQjȨ(逳Xg! fzᰖ*uD`Po"ouk+7Km`w U^Xm=d"YU6ffl ђ;1D,\kay@Ʋ$y,Ӈ4ᄱj*w-&7i^3ƲzXI3cl?dYe{yedY_均ʇ3?eAid打Fĉk"<6W"MjM ECTm%ڱ ߐctk;o\}'JVZ|MVA *VZrElY]Pu-X-ad1֎jƖ\cҨi3 9)tIME 3~:IDATxٗ\us@ݍ 0P$ҊW2<-β% ('di9qbNJmYRHq@$A 1 zíj6zNu7]nj}>'d$s\9}E."|N_ >W+rs # Xn+f]-y-pڳӾ嗭c\`ȅ@}i+dF" 7D3\x-}y9-9 GqyP|}ʥ>3)͗;Uka}y90 4j-a{>4ɄBl)rӾĜm/=*oß7\22!ie9n9sp4>o&M&DQ.9) 1ls },MR|A7c+JeNLIm>GK5A+uOJۛe ͱDl'}@J]GCElHF"DνJ?h*xͱ{ρ D{'}ZG rA+UU[$9>[dVow!sD-ܜ,X=IjR|gMVd!z~' ~RcQG~^Z|p)!rB:m& RI%#DNȞ.[mCT[f!rB:}BCl:V.òjQ^qv,5ҩ$.xu3c*OkR#|Bw'cʡBJ\2p7$4G=r aКL!h%."Y B$<,4GRZ ^ (N7Py*qvI" OB$y0aȫ5Ir(ܧ<,*e,!&1|BTD 5 ^nd7 "Ok#'44`ZGσ)D~q9<&a1K#B+:Ҡx$&T"qbsvӚ>4m-3E1}2'tCcOBA+R.#h6mD8.#!pBk߼Yq bBH h.$% F~rs@y ,`5 uD7a;eA,*axDΐHL}vUI6 6X͊zGNOhkQwᩖ$7w%!nıj- "$~קr>#yFx#b|4BOh26Sn*G#yZ-8B?BݲI;&/y!e$M,vҹY'=8ǔٌXtqHsÆv킒Щ3MrF؈@RMLVxMikߟS"D?ppR2#"đYw]'4?]U"vj$y]LF|;a u^Cdis/'4Y06I2W(d @ꨃVd/pj#Bd20Vr-F<12gej"NթI"m M#N*!EA?Y|B79b8DYΕ0*ԑ>M0Bd+7Y/F9kYL3%Ld $] ~B\MgnJ73W"] >]mQ,cy,OhnkWv@mdag#}}9l׮[<#4?gn'Ɍ~~WjjR59z ͳkǰ"Y/'tcҚUR.=PpX3):oBu<2j=gP9o%EyXGgX!Rg_) pΈ PoA_g򢏮ݗh}>ES ~t"5#.8=w`4A/#F K zH qp1s:뜷+OO;sBS^y,j(@i_HPTFC"0i OM;Fom*Y0@M3 zн%A2{kplcUzhejjMۂdD4z ST %a<$X{Hŀ:HkzRuL&:h4^ yV[7Pt&{T[\KOmmhK>nܸ=qD/K,Cc Wi`M#.m5m .x)ܧWχiF]Ҩg NI`LiRҚߺlTgm! rBEGuG$Qq-S`0qJkZp1౽-|t= ^2( { x{`k_G/lE˂hej?lh܌7BY<6Hg4ػt]%col퇅z[~)G2ܔj5CZtFCYsU ioZ[J1qJMCcwxJ,tFk>9F.[LkZ].;ۃlp!E̎HTFzS5vw}i- o+x<9P`.b3ܔꃴFŧl{p5NKmZx|;Oػ4x6RQZp:5Gcmhcf$ ^MEl4әVu]8Fs)Tk5ކ' DΰMb:`hRn6-S`FZ# Z[ bfS^N>oYaZFutFk79Fk: leS?qp4^"bd-fkt#>oMTrAUB&u՚ I|as)fIنu ?`jJ3\XؔJ֨xtL:SHg\J5?a6̰ǡ|#h4_F 0KHg4c_ے|$2>?P-$o t>tبiHgR5ZZeUsU F#C|1tf-ͦTviafSi^l.UI>a>hwd)Å7JCYʹFLgSXryZ{6 u-`8,fZnN7Rk ̉xKR48S_ )' phܔjMΤTLMk ~͈n1FSNG S^Jks@cvzXK\3װ%lp/Cۊ֠C?A2\AUkҬάk _ߊu|7;>l[#m2FXPHa/1="u#̭:xB˳yMRF5#tfw{V^xug s-[GGOLՙZ,p߾ޫoGymA.e'0HŃW g@08s{Ỉ2n/m^h;?> jM΀Tfsɐҁs ㏫<Ԟ}{\Szdi$K|"pkN4B25GTv*y}M8 `.9yИG9&B((0$zK&zmcAu, v5ә-^YJ<3[֩'W^6sX9*.ZVz$θM{yɳef/-U𫹶=o#7Y)i)`d7^tF QMɍg.%Mw|'ն֚mx$Wʼ{O.DH VK:ޖ6vc$SĻ=.)"ui{~anS |Zj !v˂­x[ٮkE|錆`%gf+} b)Zn/Kf[,ႶҠ[) 0bg(a:3f- @~R,%*|V̎X|x`x9=  s|,-D66 ]]  jz2ϟXtp޵h=osS_{|`8C>oKߔ ^LM)!-0) H_7\J]W*wkP^/-mxryWy)%.i"uh A[0g5FMf1ݻ {FG $54xv̋=RH_9ۀFSfS*"Vr M(f0]3 ~p&ܷ+sʉ `ё`qmAqpԣe"E\iQ3wo,ܩ 7n? "gn쿰/ hvV6-M."d#bLk{HS.wƁ5_}̂dZ_hqeNq`5{e4R󢻦5Zvθ /HW-dJ|"go|~@D5{ֵk`t(4=O'O3WHgBv( FL_ k?G|_ͭ%ʼn6uOpḥQ^5ߙ^i}ZXCJY]{_tys}*Et.)zJen #w :5aSJxPZByLcwbGݴטѨt?~,d?YKo}=:p?UX9~SJKXRҙp&dP mkEz^M·ФwZ_mai!%,-_ڰ:k=+/fYÎ<.Z\x%QeJ [>AMFJ) Ԍtu^e2w{oa/ӇE~~+O/g;+/45I(-Pn$-Wע55jCҬ"jV^pZ'fj h㤔TAZcX/#-RY_ɝWرpǛW, k:0{URR@.̪be^cogͥnKUN/Lb~4}O>cXnuŃ&(lQ(ij:oBinyh%!فؽ |d:#j5[};fRlу^FZө՟␲F'$y̷f+\Ь4!{W-&*>~ujeo 9Ps~Cдx3k=??|Pѻ+7ЦCchk}m Ni v-8{5O 1f+aqMj Akfj )))Zn?{_7oXrN"گ"qw-oy ō= 1Kv]Rۂw΄vrǴS š}uqRixЯMZ&8 szSe}C6(᝹iէxzzJ6 E4  /llc)yof?жx󤔳|݇\Uk4fpxUKC0f:]TAҬ @UnL |vIJ6ٮl8U (Y:Ӱ`{*;@u+sWeƃ^H5=g45 ʻ0+ռ dёvf#&Y3Bia0ų'|2Rȓp|߿ـ1p[ .wũ(%AzkŰKfY'rk);~ԡGÃ^4mi6!en5\xkTy&J1wka{Mq`SkTQū*Ɋ' }ďfgN"| :4=wGO.SB ]`W`V5ϟyd37%.&F>](X9Jc9)X%y•7+:y(eW7Xqu 8| adwNBmNRd_Z#=ͫC6}ĥyTO\ c*/c 7 iSq}Ҿ%SW+rs\9}E."|N_ >W+?Xl%tEXtdate:create2015-07-06T23:23:14-04:00~%tEXtdate:modify2015-06-19T10:20:51-04:00cIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/gitorious-logo-black.png0000644000175600017570000000145112672631600030703 0ustar pravipraviPNG  IHDR@@`UbKGD̿ pHYs.#.#x?vtIME&LEVIDAThMHTQY* !MD""#%IM`HK*"jӢ}TX"O6iEBG7}w޳݁asss,rvJwfX 8ӱ:E&p={i dd D%C 9$XZ+?FA + L1I,Gsj:gU|Ъ/Ue%@%v1>JRp,lwJ˨%{&|Z7ǪG+4t@J9JyFGT\e( __,}\oQB'NY7괆6K MRU9Z-6LYҷR$| 3oBTcG"LIV &r֯5J 3y8dg7s#x(s$ζ'7dv饑TQEk5"}8!fpSF0޻(J2rY$|Hߧs)6"u']У:)h=SF I#G37~EhpPmKmb\9~ߝh1IvcH-ʮ;G< !Cuzu?C yXVyu@8$q?H&u.Z*q^@R9_rIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/msapplication-tile.png0000644000175600017570000001324612672631600030452 0ustar pravipraviPNG  IHDRFgAMA a cHRMz&u0`:pQ<bKGDCtIME 3~:IDATx{\gy;-z}{4%{]')D.-!%*VHJ@E!Dvxvl̜Y{o3sΜ<3;{/tҥK.]tҥK.]tҥh[OL}2">[O$'f@>%Y~\U汜(X"=\.ogIj"r"rURsXnJ I!19nop8)$b@h?pˇKޤ\(ccJѵI#H6x:Dv%3ea`_W/Fa?I$汜`{hGJ4鹧V>H)'Ă6xn|`s݀n<ݧF̕qe`mW k%ll7%0ei@>j@YRd~ԉ{KɃ9s_oϗs>1@x73";LjŻo>V [br@5N^s:d~4LzYE^. ܱ aڀ'"qid#MIaO\sхbqVȾY1r u S,4ypL&60v@. 0NdLX(1f;4;ε)G%uF$x {-C$ӲGDFFb7Fn@{,v2=.aJG#7F .(7K6E>%hzΫy1rS9.D*k㍑бf4acZ~ch+C@ؘc7Fj@Ʋ]T})?!-EJUDޘh㍑xn'*?VyD&ᢸ>Cdx++x+`Dcyhd ߊCk؟TuA'R#y0 WABiZ/yBڊuF$xc$$ȵ[U"Wt⯚]vQ|4.L8L8M3V@uAr ƞޟ o m@ur ΐ j+R~%lސTE5+ NUqCo…+b^l ĝ5d(*G~sHXQYH{-X۪j) H^!Hl,0saiF`KB%P۶I*f6n5Kԅh{"H ,^)"2Bq*7DiFdv3wK2Yʖe@1iZ1VG_]6h43nolˀqkSX(xbvX2mD-_B۲^ҪX\6TӤY1!,nf^QT!xc`sqV\o=XJz`J]\xw_*&Cf  06xDrf=T2jtܘeTqv g>5u/4H~2 S#/rSZmAnCmT6iZ?M}y)6$/+ۯ$X]<+qu03<[!l"X1ȨWcwcbp)+1H$u,XhJ"r:ݍ)8Y:og0K,Bfq %(͙p "L\q_I3baXw5oCIsHCdT$nW3/7m^lh@Ä)K\dNO1;5;)Z,ˈиYz5O"xbgލyp_L?sQ[YQ5LVdlJ'11ԲH"kX 7cmkyx"Ų֜W0/W6zzR# )**dq_ʆ@b_2 _~ق1P}N.Q"srPA<̖b_nvlg" ,'NكLXh Kda-BK~3u7R5gpV05mu6͜(2zn̈n lf:Xb |^ʄeg4yѪN,˂b]d4V7풙LV,X̀dIQT}E/.q~D%{bJX2qxVSхSs#O&2EFcae47f9fLw翰o#2 3 y aw_qo* ?nEلxnPD [ 04E<~[nɒjYa9TD=dF,AaA9 |A:G7zSS+v ݚIT h Ad46V/1bfE _,S, NU}@Z])"n%g/+(E#ئgM&nqhOD_6l!KzOم)ߓq gT}c\ )Ȩe;ݍY6LTm[ T;A'k灷!X'2Q#!`kv+9\W?g|Kxn|(sf"ZaC 9 u>]3 xٍEfױh3 >Ix ;_{Ը* |B0"B/ڦbp3XtbnS(^jm-מԁfSϭzZpDFUj/TIp`0kyv0*EE?-"j#B>wMP7,+U73AY]fp~$ 2nDt]lmd2V>U[ '؉v[g4US(&݇v8> hgBw3=|f)aU#m0 ьjA56DF¶lƯ /(IP|!ļ##u6xn|x;A[)53/ʔOծCmhحf|/EYGᴑVx>:^؁fϪxwhvF0lm[eSww@S(Np+o _d+ 4=Pު~)Gpj#\|*u"<{窔S9C,0}AʧJV7 Bmhحdhj14:/_Rb4h6Nx}=_DotnfVFk>ڶSpzT{ \d6O瞗/YN6L D y1;l?UGYu3_ ֔{d6n<4*o_JK̀9uOۀfGdf jӶ-6U ܮNatj'M Oe<7," @o*ֳK'M3W73}C:5]\ 9Hs3UEMG,q7ߕ^Yk>= Mm@vŒ65 3w @iJKKKуdJ&IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/icon_sprite.png0000644000175600017570000000511412672631600027165 0ustar pravipraviPNG  IHDR jfk IDATx PU_NfjۘqbhN&CX$EE7qpAhwq uW4t@NDp," <=~|˻<%3g?|s~wS{3{rRRZJ"Fp8Ms8*h@D81JNʊ_VK]UɤP%**]΁^Um*vV%%BCg۴Ƀ!Yr/.5C`_t78 S;@CIm6XJF;ե- ž=^+_`jhUư4E6اo 淨b= &z}AAh}Z,~ѥҪ~ia< w݇uFU^{Iz˖UWWKii͛7֭[ OF['uhɒV|Cot;(OYUJ`cG9۲… re)((0آN͛ L-w$t9'#m{e˛A'hN\{F`4VеmJ_~YTsb|.hL`jh1nLX>S*h@D8w&"ٳofϞ=}1roذ/22r^XXXvHHH b'UV͙3p֬YZ#c9O6-H5+0` 4#ǝ~b͚5dܹ2|Yp,Zg!̫+5&8dC"9¸.ɓ'۫4YxXBV^M#1=H% ,h>]%M &rKtt 923֭KTX.]* v%ټy32n1rȅE3gL #G(rrrdʔ)N>-1rȅe˗//P)*k׮k׮  aC. ,;vlnjc(77W,C>':.YKi&ٸq\RDk|!wٲeU*~Ĉ5\I&ĉKqmj<tNHH[ibGZ>Wz|dԩ1r=z$''v2v/ؙ3g aaϴD}2poŋ;v9:|["T"2\Xw^|Ҋԟ4E񩘕7L~JRk|ѰoxZ]k|e}?;~wy~~3^~]<0 ꉷH摋(i?+s1j޺ƍ"ބ,̓ Z4e?Ox"k3Oyj3~Iy/z>OԢe?@o@֖Ԣ_^TL`xa`A-u? @|Z O Fdz<>/Ǜ|?w{y_=F.' &#f9{a`#p;ߓ>j?-{O Slice 1 Created with Sketch. gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/icon-search.png0000644000175600017570000000033612672631600027043 0ustar pravipraviPNG  IHDR |lIDATe!Jq_2`X4 ]3m7` /&xo`3&f"0$dKdչvcdQj޼hhXB'4]ֳ,̇VܻNŶfb͉C_n<(^j.DM*"P,b=NO@%uEptTUQ V<8rKv̶!Ho3=Ӏr_MlJ"v&"qLDv"&␁z'B=^Rprq |K8jZB WxaRrZTUA ,Vv4zfjЙ6ˆ'32-JP\Ĉ՘p)YVח/,3IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/touch-icon-ipad.png0000644000175600017570000000664512672631600027644 0ustar pravipraviPNG  IHDRTTkgAMA a cHRMz&u0`:pQ<bKGD05>9)tIME 3~: IDATxYl]G3sz۴ٜFm *$/*-<EUB- -QT(R%* Ӓ%8M$M׾9gx8}\/E{o#&OAn߰MhMhMhMhMhМ|7=ccT7{=1aTy4wg^zqʬ2*]j0̘t׬pĨ%3˨.x@9 Kwy rIT }[xV˻#<u`7 w}[ބOD>0-RǍ@ 8"m*A&T*2(HY3d`؄Ǒ+<%APhp2j$}lB*6Ћn6!q`F;&T [4>+oS5vlao/%&:c#-V ͆RA~,BHʲ3?cz̨CffWxF=LhVh%[~X~L.0.(pl`NFgGynj*i.CBA~5r_rp >bTɅ4ED"t\: !E(_{taУFlH^VU %4"C "?(]lS#1¸FНeO Wpj*8IT.(\hB"D5A:Cj DJbr^3Av̨C7]D NRAdBz8fzNi"'4GBs4BjuȺF˾M6P Ba/bp®S !uéבoB8ƜМHW(v9V`5e-?澻*\IU~p&yJVF3>bt"5V&Ӕkgߒncy5I})`(Q,mftJHw]޽f6}ҟp 4XY͆Fd-lj@SBM9 H̪ek ;8-AG9 B)ɱ*|Цt\NF ,g=J ^_|pG ʆ86RuW@eA RYX"P;x>ozM{5\ eH8\=! a[3QpWX ׀7ogB jGfٯ!tp[ʃ7 : }̌ƈ1-=o C)*; }|!!.w ;@ @垱ʚ!K*2<=Bhj++Z@OXHs'J— wohtRZ#JDe<=tf {;/Ck S6MxJ𥥅bM(8+D Z*U< tkkp{A:W?Y~<nn#g+_UN98> FP*oN2|O].G31֦fCR NOxnDńк1}u?ODbBRp 4v#B=^뗬XAGdB1WQVpZ_/mp[͕/$^/4/&k1g_ę<ǯ$Qvow|T;[߁RRWj+>~ n[vxO'sz1FBzq-W1@t d5 ^X kL4] wla273y>,$&[dwo fwT v&H ;aϮ9V'^S.#OÇ ^x8 cVi[k~R`f5^&" n>?y.mw ;J"fJ6 5ɁC9'bn%oKk@Ur[eKy.vL+>ŪWgj"W%0>cU V:^dbIk&'st[k@F(ۙi3߼{,Ԏ[&45fZS6#1ôߺO9.Z[j"(V%g-+vAP\  ,`J2rYdt-1t-_O6x=+ۿ<~&>Hl/m ?L -e B. abw,H\x?;뛶$`$ʒ6m٬FAP.&ߧ~f$O;+ ߛ57ݚ;-?+?+i?+?+?*)1-% ?+?+?+?+koӛ?+?+?+?+?+?+?+?+?+iqӛ?+?+?+?+?+?+?+?*'3)#-?+!?+?+s?+?+ 31ߚ?+?+?+g?+?+ ?+?+ ӛӛ ?+?+?+ ?+??+?+?+ 'qo)>+ ?+?+?+??+??+?+?*?+i?+k?*?+?+?+=?+ ?+s?+?+?+?+?+s?+ ( @ ?+?+?+?+?+?+?+?+?+?+?+?+?+?+ ?+I?+?+?+?+?+?+?+I?+ ?+3?+?+?+?+?+?+?+?+?+?+?+?+?+3?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+-D")TC! gjgiTC! C )?+)?+?+?+?+?+?+?+?+?+?+?+?+?+   @+?+?+?+?+?+?+?+ ?+?+?+?+9yǛǛw7?+?+?+?+?+?+?+?+?+?+ ?+?+?+?+?+?+#?+?+?+)ٛݛ?+?+?+?+3?+?+?+?+?+%21ݛ! @+?+?+?+?+?+?+?+?+S?+?+?+?+ ?+?+i?+?+@+O37302?++?+?+?+I?+?+?+?+J.&+}?+?+?+?+?+?+?+?+?+͛ U-?+?+=?+7?+7?+7?+7?+9?+??+?+?+?+?+?+?+Q+?+W?+?+?+?+?+?+?+?+?+?+?+?+?+?+Q-?+Y?+?+?+?+?+?+?+?+?+?+?+?+?+?+ϛ S+?+?+7?+3?+3?+3?+3?+3?+3?+3?+3?+)?+?+?+J/&'s?+i?+?+@+O S_U?+?+g?+i?+?+?+?+?+?+?+?+?+ ?+?+?+?+?+?+'ݛ  ?+?+?+?+?+?+?+?+#?+?+?+-ݛݛ)?+?+?+?+3?+?+?+?+?+?+?+?+?+?+?+?+?+?+ϛ͛21?+?+?+?+?+?+%?+?+?+?+?+'?+%?+?+?+?+?+?+?+%?+?+?+?+?+@+OJ/&J.&@+O?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+ ?+#?+?+?+?+?+?+?+?+?+?+?+?+?+#?+?+?+?+?+i?+?+?+?+?+?+?+i?+?+?+?+?+gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/ci/arch.jpg0000644000175600017570000006120612672631600026157 0ustar pravipraviJFIFHHCreated with GIMPC     C    Rdm}dhhٯXV%yu + uYlx 5cY]ǭ%1K+EVzU2˨ښ͟%Mue@mc[Lͻy.lג%R,RGR[ZfZewj&f>,T(=y}gX}P//(y{ ϻ(օ.lwt=o/NՇv&5)ً=fjrZlA/gzѭ=%"]]Ǩg]RY؍xa3:S3vm,9ݣ a+zO+rWyזFY)ZV.l|*r[mKhLր+7|5Itxƻ_*Ra{]k5SY1PX׽cO彮gZoVVuiӞVf+iW{{HɅL5jٯ5&ɲUoMi} UuUӞvl˯sR%Nˤ>vuԾr8P ZW0Oԧ>PfV` 0NCń`#H 8p 8\ApL.C'S i0N*%0N *I&gV%N[(zt2bG EW˩lPcM*Ѳ;SM+Io|ʹfmn~or:q9կ2oJ3vzBYlc+gˁ^9ٌxkNVOD,RK#i[^ucjVTuڶc]]]|I$k3N[gblfĵu$-)G XsXycRYԅR5)`X$+Y]㯉 f5dlVgIJfu܉\K5dYe@i<\y|C{\5d\ ^zMMl_}r z1 tǼeɰgv㊾?P-wQYυV3c,B5*+_:kg516dt}6gǝc)o⽎`/䊳7٬|ūG+ìyy%JCk<ӯ,jJٍw~=$6/{_-YϹ2+wOݹg4pzEtx%-V+"oAקb82f2 Y =M]sEvPSJJ䁄FhHZy007P !345@"#$0`12%67Bpв21p9牖'Vuc%rsWæ^ Kg Ssoߝ&ov%?xDX߰2;`@k{>H9TS%H4`ώV݇=f'"F4^^!AWڵNs__`x ]QvZ|L>ue:%{9/Nϐ]v-9CbT\>g2甍~d^1>b_e+X/m&1s =]~9ֿ+*ҿ+'LwdQ<,[RҜ"YN tj59[#5$<4iGQv{G.LLv$iλαLj]?8#8Q?O+q$oUy&oAwINƓt38"?O*@ s 2b{i1Ux)oqI{xы'Fr#v9;ŹL'X.+Tc}ypn|,8"اyg$Z F`Y I0%1*Y~,OŝI?u)mz=9K禘KT{d"Qm?5 1 !A"2BPQ`aRq04@$3? dGc6KOC-H ƻae/=2o7̵%Mt AK-vZ~fZabMVu`z o[-v57ʭdwXL(kJ7SA1D}DZZK,;ֈ/btO̲Br#yK AjBV4hKV E=UB UlLŸ*Z75@/A=b/5fSUEGjK JKh2Tdz~NUd}kF`#a-!icH|5eVï*a8#M {UwGt=8vл(Z.B\B-B{U!ػJltu~GG_WtU)\N< R# 2-4ib8N.&s=YbI:zr6+IOa9Ro%bzH|'~9Yp~^vr87w>ҟ!vK.3DZpatu25Y;T+4-|^Jk'ü#tSQO 6e8ƥ"/OV,.ʑvWLƿN)?6A=t#y8tr03-_܍9|̾%/r_2/%/2>!]T%|[*UT蕕L2N!m?M !"1AQ23aq BPs#@Rr$04`bCtScp?^31u3JY1Vt5ԍS#YYDSQzB2sK)|"+T4$ S3L⫙2T+_obzTWxKK1ʧ9րuk1 *PJ HIʉ.TA\oWnt`EZx6wD(oPGcͻiZ D]Zs)ƚRp%SY\NWRGxyIf9T1 dʗRKK҉GlA@59gTr+UI_!4܊̮YFˮ&RV?ͳ2h-BHl,*X k´Q5%[aKR]l+Lvh78]s T} JxBJ)' M<- O US0NiJMes,27Re#<\B{KzSL93,0!v\ðƓ~m&!!V%^ыJriL`=MwG7 U4Ӊ!N(nu4mLL=s"g?MK7RةH?7/*q| '-?qM"ʞZ6$Szjeu*P6oP&U%. 9OʛƜj}싸M֝1,BEVVU׬bc"M%ov4dELH0l8pHv!iW4֩+(M-<.Z//vZ=`1 8LUw+yKPJFdBso-A)v I IMs%ͩ"8j4%w0VRRMEiIߝ+Q+LiK4_Vf N\LIm$mJRn/ YnK QU.]w  UP'a@ .h++}qYׅ#D)IL)yK˼kWX î4ae auJ !uϩ%Ś4n}Q0iˢVҥaz+R9 oaKf[+ $_Q\+,(BR=Z1%hNX1drbaS^|'GR Hc-ԥlM2hVÕ 7:ɔ᥅J֦.܍O2tQi@Kص /2dmփyR* ˎg(Dq3 yjsO{FiKuZbU/4Q^85B;ʂQ6}q/mj*ڒ6FK =Pgn Cac˨rCVIeٙ ,+8Th?B4co>J늓ܲq5NWU\JaF PeLu1Uu;VNR8齼ksոZí*h,V*.D˭ٶ$]D/lÀć2=ZC]i d5<6yKkG*úL4Ԙ*SX.oR\6*uHozekqo ^}(d%/'1JDEIrة#d<G^i2bq̸JIli;kouVVPԺP$[ڣ%\9R+ i'6R N5[MH* Ŧ9{p>giW\_L'Zbw 0ڔZ/i?S3 V=|%-[6d'y2m=_ -'qjأ6W~Y}Ȼkz%FW:9Dש*o!;e\s~&RWZq͟8B\s`f?K+m iͷ5:|N$۹6߉ey֕6F4pf^km0|zJowBu83mx]b9ؔ0g3_5;OTҰf=PN }#^# yD&?2{~ZV }өokuzN8RL ٔ.QJ]iX3mnSNmBR3$uSu<{>ZV }өokuzʧ!iѨ:يxv@JE2}1.7|T)S6H׈Q*D%r]iX3mnSNmm:w8vZi6z.7|T)S6H׈haC]͈ 7Tv&R>ujjԆ҅/5WGuls)*>eL,VBv 6y\~s Z6^ Z4CM&+ ew7aa:_F7>fY-î[zChLJNJ_/>SHSm3iFn9ޚ : yRJkDi=%\*x$vgX MmV㰈1e댝&Zf*mUT˻J} f/p4cN[%Vbtbٕc@5ɕfKm3A6g۔6 5@ԴԄK(69_4r֎z%Rx8ݛ iuI|jw?#ΈvfZaV9Hh>fnۜ7!'\a2})KJF}R79 Hi8b{CgUlˋ)>KU#U7vG;Qi- ֻ4w?>O %,S+`n]| TҺ>n>Q-&H߮\NVm.MMk(+ė}MQdcDKʧvM.qqW=T!\T7Ĥ朗H.)dA"UhsYX|ijraRng0&96wTNR^ʍˉ0*@YB CJh^B)kn'gufy.zILs"m7kZ@@.p;OGG#wB.Wot3{33>孷e9%ۚmA$]i 9zELEz~l|<+)/ɝS:FNNeP:׺>QٞCMOh&]aI(nM'=$csYk2E2V#.im Ѩm)Z@)!$ĤTo]m "o,A&VI&oHnK9>yWt8ˢIJEƮ 6g r1KE( /0Uzᪧ*퉦RRm]K4-@>6̢PAmzĒVekm%#mnD(JKW$y2KXHkJ92J22%I%DYuyU 7t70au\6^}ڣm:68¹;v9+X\>7,9\kY\ w~JP\4*b>c)&eS.V't(}eGa'q\ErkyV*#rTr|^+;/e-*S~No٥%(eba'q\ErkF2AHk8ظi.˜,V 0%u7$wd!v ڱB;a^ b+m7D73 &ʖu/ydn!I30Wu{)i0o4V.,mhQny ||ިoady% ͻhx(| P*XWɣXiĺkyoV᪳ P&D֕96%_Kaj>wƛQuw6nYR4iqfMn7,_qL͸k cEM]3 CjmGVDߔp$Jz]X Zm*N)/&:ɚu6z[Jec֡#*i6ߚq )ze9USﲥkmTH4m"I9eՙ(.ߛuIL7u8J^N̫ ;j8秨 !ĥI8Z__|;噙̳2"(eL>ËuKer0XNNi4mA õDd].P.V(y?8eK1=٪Jg4D!G&}Ԥ.PBQ+Wthf^" R[r@LXϷʩiC+GuV UYex4D79ilW>4 ڕ.T&a u̵kH .T)hw%.8TRRD'/U-(euhԄS2DTN #eU785̧q};Qi*II qs%3]-0غl&fU{̡ʆo UHuHp0H{W^4%\$yS8UˬBW̩J2Te#0+X]CHӆ~⪕(qUA0=@ *ujDTZ5\cmM ޱc+#k$z( 0{T[FɋYl#Tڕ p?|G  AeaL'>pq9Gq"W:*PQk0)>R)N-!N[r=q#D>tH#D>T! O.!1AQaqP 0@`p?!лx* udUtߥO BwҴ+P0U%d; HT%Lt`0.4D=mRH[Jftsor)`v,RnCũ 9[skO=,e û1M Op`)VdCܥT xgx-@2Z*Ab$^!PwCx- .o4XYjhOR.-iΔ~ W]e%H_] C rD\iƩ%&DK 4<AoKQ\%zsD,J!_4gd=?Fp pB247ۺ2ۂc RΔImEETlob:; <ɽb.f/CJc)./~Z{r(C3Pq_{Nk=Dym28 $ }|C*PIޜ19ZS3[J0REI;rRBhшZ*f𿺦VX'Ջ"f(pԔsM˂x +EvW (:kK>$ܽ0H5ܝsЮϿz{3iz~'"ȦM@XBnҳ._Hii y*pS4_* bpg@^Fw/2JH9ا>Y֐2zJ1B&Sc3jn0Bf0X\SjL-6:] qSs2_"^~w-$ ]Z8J@|jZ)3eeF^|U]L' )oyhNdw(2`Γdg6kod &3hC Z(ʛ v& (h}:ŽbK}L͹ %^N=TEӼ n;QJtW"!.ăHsk*̉)VͮP5G[M%bmz;׿cvSC %tk;ҽ-SjV*XYsI%3(Ւ[[:e>mgJ-FoָͨK feD?iLU6vjH2(FR]soO n XALUy9Sl sӷVK*^:AFvҚ[6~>V3ЮźQ]: eW4g"bQɲE0.=)у8S[^o F~ *+n`OZz&Ky3v㒆EXO?{D>)EK^.tbÙ\ZTcrRɭRDKᅦbm;>;VEeqW|b͕qcwv+|e2((5wñ]̞^kˆ-.v+vӱ]fbB]W|/ R]ZAobm;>" ]]*BV@@s};;oخ0qšñ]h]ްc~^|};;oخddݼVD6sWCSLz)2ܢ.JͨVѺ7,\a=aH`Jg#4Q xD-CTBl!eqQ9۩"j`"jin JEoC%G(-D ϵfpMu;zz(c1$QDZ d΃`*'QQ ׉ }|%`$fHVا̓4yo $ Ͽ ˚3 {'Qa1*oַZlvvc-[pB#5} `k4Sٱ05ձ}C'/z@.2@FC@-L[ TkPYJ9}W梆ff΅ r$E/`]G'B)y#҃ءY7q N&fYEdD5VGGwmu$$רdgV%G$jH&ȭc9A'3FHw]&Z)2y\^{./rKݘuDu~' e ŀ3;Kx*JtPR Z6;u@Z}R٩*T'1Y6%:1Qgc$=9ģLiթ:/OtE,f|xW~㤄$^ZPjM(Q)MZQ/$%,Aj5n,d޴ͧnz\; FX hmdf Lej\S硏j'gUd2CLd8YCEDHW 駕4%[_q֨/}jnuKHgKm7}lM"^!MNxzAtX!Հ "hFW BiWxzAtйvbݧ~(`n@oo&!䘿-@1DH,4 U\x @Y$yE= pE`b[ DFv6O*?wp)O*`s'wMI* Բחc]J&b%fԅW`Vނd/PN1Z lE.,&,6:~+(=21>Y-TʧW_tJ 骚=PhEgXtMHA@Wr׿ج5QBҾؚ9/nLo|(o]<7#}$u͈4lz^ v|k0fLL5{}w^ɩuǾV>>49a&>W6oJ};\U̔:󙬊)xnqu~ Q@^L(ڠT+( 4ĵnBt㩗. 6r0IA\,IgK`[[5uo7dՅ4uۼ{`ƏX5x#R&:!N,b!~ڶKVܥ+>DgC:_ΗWeX0\ U Ľc5zW$AmKp[U7^qĭ4E*OzaO!嫓LW=;H-ްiJis+k&2srkӼ󊊭86swFXzx7K3a4V7va~ys Ş5<,2a"U>a)zQ[a"rw?BXPm[wd \t秾wuz_8P_*@ha 8y'LUMzW̤վbyA`ܧg軝e\,r@ʜ;D(W5A}jJj# ö .Kɝ! ? qr?c)?b! <'HM40p"NrRD i.!1AQaq 0P`@?Z7k5c*#0J*f%[Д j#f$"R,$C-GTDB2 PЋ֮!IRLSb_ Hש4 CJJ(HjʂRƑe, sP*&hȳ+[.J /ҔQAI>O%g5g P=B嚾J5D@QH"Eu~椁GyoP7 )']SxzrǮؚ!7MÔΕ$'?ˆEd|[^TQ-Z0d"ajz&1X |7I`ҋ9$3n;f:|lϣ2H뗮֩A֧c;`FAy1vPYϖd4#_F>ǝJ@xޠxP$6#ބCH'ڔ&"-{ZAȢp,xqAmY [ "l1|քNzF)}|7w;mR]ǣoJ\x? 8@Vznh!lpI/9P)*A3J֐( *dwk++e@E! zp)AzvYl8lEV_":( ` *C&>YX~~&$C&1i=ڇW%$Ngҋ?TuبoVJDP&`һ/B 3c( X23kaEZ{job$()eZ6*5 fC Ҡ*CE!E *pn*EPÙHS?PHo&K0.sDd|"9~ o.ӟJS$=-VNQ C$d3!+yujؘ*ٿՔ/Z1zfnV0(Rխ LZkMf1f}k 1y.XǙED(.y#ȥ5V~uaGt뺚1[";DJUsԥ gn`9{;(@R gnhy;e v8;q* "vO ;|ܬϦɭă;>dQG*XܽZ1=_:TؿLkyiJ$֯w/V}(*PORvM9!%ۖ rslXiV:@4PM}6֣#-`jeGBF~i|4[o͠ ݼ)d/)p[%#"bLuJȶ\I|NA]2L߱e -{T~_{Oz=kl&-iGZ9- j*\HO.!1AQaPq 0@`p?[>>5ua?8c䔇~兠 Jz!eD>[ql'(&sS6LN62)]%]tNy264jħgQQ8xq Qw 'qk7=_񢢞젭6;*:脲,[!tXa0>2ϙ<%ڄOV@rAAA yN;VԺJj[At(S@5u:q:K!N`YuĦiD6Oڦ%O'HF#akIgVKf6fn#h4@3=!ATƐieĀ:Pl-i=sRG ȵ83bnHM]#Gd5<Q>S*5YsrR;XD0 Љrt Vƈ tr9ZA0TDM&Yx:g \_jaPX;ujz4bX FJo F[Y(-A}1gnYE<:h-*iDl"t 50cJ9jo9D"62]4&ZCah"O_;&bM-~ٖ#b?^_m**cMϮIPU7]( "lO<*}a@АMkUY.EPLU4 )=(k=,.YΜixZ WQu^8+TCV~G7]pb҄UˬݢJ06 I N@Hp=G!<h5а969I mA)tEZU,`3u[|somJլ`P'n!.C=e܄I[ik rot NL$r,2t nDWBK5pSoi: Y[{ ѭWnf_Dznce%xdȑR6FU"OCD+QW "&Dq>bmL:PYvR`$f< ZDA9lt;.l`}:GƄ:c(" H)(DC#r>r8`gOoxxɝh}vA@U-4~a?a2. RDeg?T") ZP?jT77驾49/N [r^p@vz0ro~ >ـ'a:[A9ኒasLlSQhiV5w;"M6򢚬5p $4a NuBE5|jӗ:њ˄ʘe؇\(ƊƀƷ5ibdZi@o$EK7Co} 12E AeUQ柇 7fҺ5s'<M{1v~V;^0d g{K/kZHj?r2${;8zX4lu!j1jtUWy"ȑא>q`m âdb56*-L|޲)A1o2Dj7;BY"4xy!4lksech(-A"M3ѪQ&3\YOUȞ[q?1F~^~;e71KO:^\"zIu@ԉA )(}"&uDnxJ=}L]+ip;x;›ԅ'7Ì4BR_(l;K~1da |݌4. (7,.㼃];쾃 AoW]:OiW64ߩP*K &@o~R"2jc~8(VǕ}J<4*dwa5Ňc?)V51GE+GQ7 Wr uqacsODFULt=e `kj'Z7{;~R"2jc~8(VÊ] x' DZ柔{_#B"c%u  "F#˱~9"#*Ʀ:PhP*"9kNms\~R"2jc~8(VćTU\wT'ez@>U'-eOUG{f+&?&4cY(0~Djmj mE ?!uȕq`V@=t $ ׋×vE _ۅd \!bqɄk GvND; oI S?HUK\K^-(AwF_\vi)& ˱9$> UtN~$~c7lfȍ %bedIo Oׇ;PPqB`FVP`U>I;r2N{t5Jo,V~k鎸`4yEc1xCdҊ7*K846?4Uܙ*D(]Tg.vPИz@)R!o;b@btƬRF z%=kTISgst9lPvte2))NEh f&-%}傏]}#뼓υֵ@Rί9@m mێwM(۵o5 S&wuѝL9&Y]Ȫ$ gZ -d`vxD8x\%T$N݌@۫5߀@b4)JPUt>F&Q@!& 6~d}}^UQ^\*Ӡ]9zo%((qdi14Qr~ā@MeXyв:XE*iX>}r(\/0sf-'z0`IA)dM7NFp"'y%鼋%14P3TnR$56.vEi9u4Pom ԡg'H㱳X)Dnf ¥Q3ˇPdvw,+GmEvѓ+j%c(7]aeq]8jpuIF|kEYAVx8`AH_я+Ҏ؍4͏fCrTt[x2dz#Pi\"1P&p[)Y԰5~qbiVp%ߌAz (Gɣe@Vٚ.TNE+/5׽,*Z/[G˲=%*4LE?^E*AízgKXHr}mɏ ?4,CF 5+ tKzL%28 ;X-"&ZBWw^3j?ӆ" ykhR>,_@Hz$-P>ʼngU{_˫o_P!2>yG+$ߣ_c(}aM?|K;dKX>c6-JOCwRTm9.N; zP>G/a ~CA>$ߣ|;~і^0?H1b2fЄG[b) ~vU0d_ Ǹq( 01d}z7nqαՍ7ၨeJ:<|r}WnIZLuAhWcE1}=]$ml&avyʍ{ɼ( =W<U)O`&EIloJc36J%=@zx)Yybh ' (eS9G"1E' 4[8XPr:y?gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/ci/no_avatar.png0000644000175600017570000000247112672631600027217 0ustar pravipraviPNG  IHDRKK,sRGBbKGD pHYs  tIME* VIDATx[n0%CBB[(vCwaWJQIt."!t1 ̮̌b<Σ#ķyQs!CMt]G~<J%T4 ø3YQJqniwP1c%scmkH#)0Ƣ(:jyi*'y?%Qި(Yɯye > CINEs$I.F^ux$w4괈-c x(Rp6*U~Y0& , ңuãPN+( Ee7"(*1BoeHX Id ˲T|^>r>S-Z3*N rOevߋ8( qڅ0ce !]z5pltE֡8U|I!τRB{ 07Ti}aoŠ iyEQə53^IV}bY!a9Swu]f2it\Vsp8AlN7 c:^RZsMNQBy|!4UAB!gq^0 fӴ3 /Q&tAЌ=02<\׏m{0ض]=rH/8}tdr*hArM*Rw:, bdr)fYhP\JD5qeZ 2}}U7jRaE\$j5nJFuq}G*Ftؖ#9Eq( !밼Wfl&yTq!K2urj܋+^CBXX굢 nARJ]=;cY:GyzwU\Ozy:fy3y^B1= bIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/ci/rails.png0000644000175600017570000001476612672631600026371 0ustar pravipraviPNG  IHDR2@X${tEXtSoftwareAdobe ImageReadyqe<IDATxڬ[ \eR֮^;Iwga@`gGgDgtqDFqFDqF@NRU]˫|_-Qy^Ǹ.݋0W_6kbf̻ܸ6<4 w5~*r?9m&"M7@vm' {_S)Vi\WG?իjMd@ lDLX鸺W-TU+@EPo\&*Rnn, fDWrX|3M=\EJB[d6A'=tx^$a86̈{, ϱPepN*_W_3o;ޥ(0E:i6eXnhGf"L|S+(+.gФg=Ych=m#V_#}Ǫ|tR D8VՄM~xg!ni%Dy( B,{(Np$3iر$h.@e[a'eJԂyϠ4>H*MHQ(Jgt-֢QI ^d„@s-'- 51{'0 |n4ۉh{V@ܩw"BT =rzqPpBHȃ?ň ]-qpgsPiSӪg`jn)m 御B2L.x!jJP! K/\ ʮRB[09Trӈu. uH$ DDQ+:ݘٻ 3/nލ%Sjm2!&D/[EHwW A-RR!PeuHim"t6lFgЫ-O.1?ƞksX~VtmZJR11Nu&<⽩,Tb,`w WPx-G5 `մ/5pbAtIVJ_]0/DiH=ô#*77-3 VuQ0.pݔ%yw hљW0),2$b6&I/@bj$I(fx' JnO"`<-/LѮ%^ȫͶn2wҗ2}}XսL'Q-,m/ꤋ4#0Q&00NKrsA,Aײ)aIEC(ERK{8Ȭ[y?iI5$%f{}u F 1~;v1l'@F 'IF'm!K7"&]w 15#4Vižn[v 8Ě)>C=LBo~/3% wF4֓ʿ8>bWX@bb@IzP9IvFfQL!2cEP(se4~5RhAŽ90_? cMEteVOaOr B]pȱؓ"Eyx: NJ)bl׋hYuTdԫw=آMgwVPOFΒ25-TD[Z2>]V,xӛIOƅ)Jͺ[)?cn28p#(mk+./phʮQ6?w7HIoSj)1<#-N9O1ͰސkIKr:(ŗ;rR&<93v@w(w:~:TFSޒ" ՊTdT9PIb3JzTQׄBP23ƵW*|@^)Qw?Iq =,<@ B8);50H-=T SA@@f5r[T%#c|Z&w(B)tDQ%vyC(,Ɵ|ʰi&<#u:3EHkzд)ndF>1V2kFGYL KMQlR&TB,igv8]C8Sf#ą4Q'?,= aV9WEXYrr*!cƯ~),=yџ]jlGeE̺5r_2Ԏ}d"a]0M9PZG17nE"Rr\YQ)!|5U(d=^ŗo8+2NU6jB[B5V.]ŲW/^䩬 ;Y"Vi$2ٲ_c(F^Egq{CP/ #K8Y+Q M1>ܞAߏ,gytޕn,zE$V.v.PyLapG9Tn:uiRZ! zI0?Џ1u#$6ɱGMhFdtd|~d\O9Ij**zD؍b)PBҽh-q ql%/{Gz*d7=QS]:RQbUMPᒯ$% du] XefQz$('ИZH#ARXDB ~`0.F|XXK)wFolzyhߚKz>.&n EjU,2' &iw[d[ V)*Qavl QDit[VIQhR@$)y~m|>?cJ+VH'6? 7 i.XH8Fި)dAYUBjE".4w-?l2Y.RjWD@Bج.߆s[H-gASF3Fj]آBP떬_>M%bt ?_rլ -h]r_ž[nȶQ+Gԭ_\Ê Z٦fet(|U('.g VFEN9}Ll4T&nto¨Ӓ X F "_fYzF~y& Gu]$O[v#].@$VA`ⱧTѰZ[2u+/mUC_ TnyѠ |l\ M"G[R$d|:ěFIire"ٵt,+ی1Z11udt*K2 sd; [)xW.z2jTh#DV\NO &e_vU2B^%0FH(/ԘI2>=L]dv UUpk"ijB$,O-0y<}~*T5LErE4B߳XXN:<9>Ed -V*uBLsN**JxRU辖,T( Gu @ůY{u|CJF(OLbnմiKhpFtx8#9FsFڋDTAn1veF^M ^kf.ĆݠVʓǰ3JaY@n&jLl:McӚ…vu?9w!/~#hM ڛ ̴nMA}m W,)(î.N y%$*={P9c DzH>Blu޾K78x->V,'JU \L]l>W*r-hXf~oI Z3f玱>vN3 uZTgg}Վ363:.g /-H+"PKۉSZ4Z_GlXMc7";ҿ (5fMUCOF6 CNft>$S1VaR&4) ٗay]%W A*|gX{Qc>iTX1F M`|![$P4ʊ$#,dɌ(?KTJR۸S%C7jHb浃j+N$,[.@˹_ ?.3ĵH"U$Z^ X02!Kc 8q.NMI6N&3n8exoWfPIJB<pREAdo$*m)e9D 5X[T$LΠ:]C$n#mC[P~Yt*d?\q^WXs!E-2#_mw8;2!vw:DUn$)GiGn3_o EZE3k-EHv.OûzE>"֛}l\/-nرQHԽab*#K׋eIƳd#G et\ ,:MێÜIC}m ٽO?eb%ːٰStB|Aznaz*FlQ/K uu*1wDvE֯SJTK;(4kƣ;v2P9`k{?~_[hʢ^9фǡ;m|]o9<#jz\wD,8V]]%K9er懇0n^FcI>`Ub+kօO1|NO]t+,Ȑl_ˮ6 ĒDbrz^pe7^[aþo確jN+xsNC߅wμ7|za2, omrbZ~,pN>;?Y,z[u◿jq 4aqڶNu6Zid@h!!F9#,#UrOa0=Då ,,,bE#ȮX3ªޏ=a< =&_~ ٵѽacj񫒆LsXuXB (wzEk_QIف*4'ѣSl{.,p۵2`jp^؇nZXPź^]wމ]aQ-oI5O3a] _wb ŭL]$"|sԩȬ= VсLIUbYY搮͢I$tf$2|r;~'GSXkᇦԭF4b4 xo[,04F~<}ۭR%myb׾\mlO.4}tE\7}M)tՉ13xF [-26t䢄&E"9;ٜrq e)K!:bwY }g;Jר)5D$!Kɤ9߫-K$$ hlDUFF J{s2R6rC&&0;@>]/Z3E,k;( 2^09zX"AEgzAV!CGȵw_$MPʩoK(!Yg 2J/^=w˙3gddӖr7)M1G,͠RpW8i\"G9 D9$ ԯ__Q ȋHŠ'/eɒ%auzHB ,F~(P|>7@9jy`i9w*2doS/^UIt}zj$iR6XyuYo?U^x.Dk_^>$O:@QQqC    Lr4_\."t1p@`~Qa 1?~|?Ym=ڣ`wZ 9TmS&ȤɓeA@YOU{YJO bQF Ţ =Ν2vU/F h2`@Vuyw u7$   (G#H @K!&Q 7oTzрql/^<+)o/%9 x UI5,GfѪ)G}/pG    Dr4]L."0|q4P威b*ݻ'U䧣Q-(h„ m5I59I%MPΟ-?Nʗk={LE{ L筵$B!IQt͚5ҰACЩ<}& | k (GT2{z{˺u8bU3[zϤIȾqEݹsGG%Gcƌ)%OY䨉ތCڪQQ,,0"[7"F10t2p`y*Kb<$To wOȗGF Z|5X;oa+iPm?O;)ԖK&=rƏW~iֺ A~rf#ߌw~Q{i&uJcuٯYdbd¹<\i~~[I_RQK=5iTO[O5{U(Z/[JN͹ J 8(uE$JTҤK/c!i OѨQH351ANau~X&/_9ZhRn4*[$OBMyf^769%qb%( 'P%$_oXQXr4d7Aa9j)_ϛ%UZaG }?0ųqs   OU9VǎTI8qUSy?{<'ohP -9%<5kҎgejjoHT(YuRLu]kaeZb{$ƳS݇&E A`B|.\X9x5`TZݻ3> MLeDJmذA|^Rhh._pt۫܅-r4(F7rtYSMnJE\ƴ?>'{IHH+r`?gϕWb+_Ο=-ׯ]EJ_H}z%JԩuzݼyTSK$GT'OP8\xIƏF-[sK+9G!=9BfʔI zuݻGΞ=V\YN?!} &7oQAT(>ܸq#rl4iR]w4қRsTZљ;gVYh6aFV(5ZT)QLQ ,{P ϨQdȐr][j9kz Y0;&hD UJTo!Q5WmF~Ҥ۴|O}0I(?ߋ|YLIƽec*1秉2l89t͛u"GAfݿ~čGުZIVZ#߶8uZ;IJSR 6;w퓱#U<*ad?hVͤfҸG2O+i.yr=凟fMMPiҦvM5غ}Lg[jw֑ eSd(RLg^`+a(raZ:% p:|L^@IbE ru j~yAIHH"W襋RhI A$ٵ]ȓJ4vܪ#I $\|_}?qd˞KRL*<]IqDY@{^ܾ%yn^Wi % q5)HgzҥK7 <-H1W^u)SN&O2m)[~N0At_b֭;FnhE/RJ:5.uS\P={nmt)QI"-"u92d(-NhtJ$-zAr.}zt-R WZ-]Bc'NɄ?ʉk)qw_+PZh*qbǒvk) 9ZxQٰiLO7-ƾm;31#wRwoj7E[ѧGW]{5GQQ:ztzZ%-Ϝ9/'Oׂ=9sb d@*s̜@*Gad?/#GU}-k&G:bxyur|R*Gq'Sp>gٺyS S+ &7_KNJ?嵺OX!GQfqrQSy -M5G!qSjڪE$yUjEYG@t%WJ +1q[   E9z^FHJ̯cGϭHR◔-.>3|t~p>O\%`*qGc "sH$k9D@&OJ^"ILYx$MYXUK},9RQJQGGs;!SVݽ#՟DBthʔiהl}șG:k+sč+2gs(f 1_I,Y=|@7oH,m9{椾>1cRyYlFBt>qL=z]Y57 y;uL|[ieغQP .^@\mP$Qa$\CA;+?hQesܵS|/ B@YRe$ׯגSr8׾={ tn.D4:rX /GuC3MFUaV{HT鎿0 ,  HQឱ*GB%r'"lXY!%u v-NJ~*w?ӧKǎ`̙3IZu6P3U^b%y%Ftsb4 ڵm!UJ"% k@'OWkm#1ҦI-&Vэ?qѼyrJ˶ %(X |;+u^J9FbdgPqj2GXO?e Ƨ>5m>qx 4ưQgQC& CP*VMC6"ERJ[𫖨EoUw۪F=Aٰv M-l%sF-G9WVƨaTA:SDm}}9|HHH rpE;sJ/.V_=}w4\y{*+2'_!-\+R۪e3 ?Cō@%Eݾ}S "ȡ}*?LFT*!])ax`.)PrrI Q{q)YAEƌS)齖vk!6}FغAGB/JeEn|o" T\EZjHүߗ*}~SEݗ%JoK> ʑGg W,WƩ52_E.uy44m?2eL>vhivN^ORxuXV~7qp8x- Ƭ6G&0SG+:C,]VѦeS%)Gkofz4iv?ٲHn}cV9 #y9dێ]icRukos5 k|?owQ(yB_(-}#սy\ƨrF6hVQ{ymPCJi$}4RR9)n-tuf~|HHH"WcՄim:0D*8>#Z6S/ϳ7_7=%BK)Ub6}G*H N3۾I"="0k4Y -0'@7hP^> GK(iRّ>GSsыJXU 3Kh+es$GirQih"GQNq2 [E 'IOxkHd9=Gn"mZPIN3NR9 0#Ҥ<ۈ|5i}WZrt͚5I*RD{BNZ!5N<)9×)Yes|ޤUiåJA(7oVm%o9umBh@?zskuj"|pz}ݻdKjK͞L y?|~"T WjbG~_4ji;<_Eێ0&yrRi?Z`R.ܵQd|_ FpTz[61rEC,3퇭 ͘!t͝Ss/t0^:3?^܈HHH RpEDܑCu( ;ig)H6hZI|ND,ZS '">!^)Di=gnEde?_7ukא P:3?wix$@$@$@r+GUUR47p93Ɛʝ['NN7_#ݤҗ.WYvZkiUϟ= vfN&r4wނ:)s+ e߭rwiHR!wKm%bP Js9uzU ![X{(/vf"G9iF>QRSJ o&?Qׯ]Q[3r4'xJ,[֥.WXڨV(:CNNw7)ِ>k(t|zAJ~VR,rr)R9 #&G˔*._nƎjяS%HA]N mjjX67wQ%zQ5:'u$G< |>Q$5(kf8amH5=x`ZWZj/GHi*#~(SB.;PΒ-*Z_ϊhfUE+̢Bᢥ$8T/*.#*.Y̷V!8Qh:[aU򻱓p+jt&Եr['e⥂mZ'6oOqFOfP WhtIBTxad?#GlO\*в>ؘf/շϟԝ?I)>U۴iT~kNiAjC+RTlY3닉BUsOc r5t3!ܽO&[U 9 w-؞BD$֛ buD W(DjfQM H4rFwԭ/ kC2sʌٳJΥ~Lv 7nԛ&G|L:ͭy?yZf_;շ`i;y͑cO͝3tJFU-[ |١D7ӳśPzz:c D, ZTӤXNHjekHμ}kjXܗnJI!4/E-A9 -n}HHHBhh!Gw|Dr+@=uꔪoaYNkָv7c>>>5kV}P9jaile:tҳgOoڧězfÿ.իUWumRGګN-F1?ѐݴ;hA3$@$@$@aOr4g@$4Ѡq  G1*y9jmܵ!5J9fi"~9N8pnqVظq^[oH$!eU 3HT]ɇ!Q&~$@$@$@$@$Q$@hxJ# !tQ4VzN+= L%%O\I\7$ؓ-g~#,>d8IbY_ҹs-Dl"*jڔ;w.ϳԩSI壏;3հ+ !Y+%    P (GUI Bɩ(1]pAÇthڴi%UT{6c^b9j=OeT9ytY=:,ٍ%Knו9#w oin[8D$@$@$@$@ד1| xD=|R.YmS|HD ݽĉ[=~;5G*^dr`ҭr@H|y$Y:͢_K̘d޽yU[,]-u IHHH"eJIʔ$Vr)$Q@>yJ^[Eeq$@@6_SrfϪ՜Q%WE]](_"1sUbaHٳfysHRz}1c3g}^mʭ(G]- @D&A,EJ6WD^7F$^׮Rz I p5Lׯ_J e1*uZi֬^j BTš,H$@$@$@$@$@$@$@$@n!9jHQEcˍ[wUhTL w&ڕɓ @0 Pw#&@9W'      (G#-H{p       7uHBhhHHHHHHH"шvEHCr4\j.HHHHHHHC(G=%O4aHHHHHHH W닰(G#HHHHHHHBh(iH(GM#      l(G#z# s)       0"@9FyZ)ѐ$@$@$@$@$@$@$@hdpKr4^:NHHHHHHHKPzɅ4HU$@$@$@$@$@$@$@$((GIHHHHHH\ N\#@9/nM$@$@$@$@$@$@$@(GyO@8%@9N/M$@$@$@$@$@$@$5(GRp"$Qxqk       '@9{)pz8m       !@95!PƋ[ =Q$N P i x Q Fr5^ܚHHHHHHH P pJr4^8NHHHHHHHkPzͥDH5$@$@$@$@$@$@$@$`Or Sq$@$@$@$@$@$@$@^Crk.'Bu&       {'H  &      ^s)8pk5 =Ah8pngG'Iণ0$@$@$@$@$@$@$PFF U~ZDD-eՍsmvv$KTn#qЛD$@$@$@$@$@$@h8~%rիWcYr=zT]&ϟ?$IHFRBs2k,ׯԯ_v֮]+7n[d Dݼy7N.\GGm#}9xd͚URL?v4oɋ2]щ{ʒ?z w*:HHHHHHH "p,D4@D!:i ѣF"GO;mڴ2Qc 8@m߾tUGAB -bs69:m4-fp3>3-Y!i  mшsÚ<%G!֬Yh:xRQC&w՛M>f̘81eʔ):߼9mE d_>!iTc"G?SHG5I!= '      Ir"iD3I-c Z :1,HС-!ShlruT!O!KYjc[@$@$@$@$@$@$@[('e^hQ-: *$+VztիX("G!G!t ӧ/_>*:H5rkDйu떮m(R1q Ds8R:V_[ӵw!ShQ___] r3UZ9׮&+Q|!: HV=ykԨuEJv_òWͥKA!>@$@$@$@$@$@$@(m#F -!2(d'# k/3̾V! jjZyXσcXc>n#5NSryt FhQݰa.ՁmDlqVC9-j?6mڤ#V*~mkE(,@Ӹq lJWW蒓d➐K͡*~q      D IDAT*G! T셡#x[U:lHl>{L,Xk3*h߆рm$OD<%Gq*DE\R Fa4Os4-Z6zDet"!2 tG'gj~bOHPN:Peĉ*9jJ>DZ_&M:FCIu=a/Gpcǎl(12h Y>+rbEy^VcD_`ܑHHHHHH" Q x  Oϣ Raq}.pDvjJGVKNH1Gz;Fv}ߎ2Fl.G Wh͵|ӧ4j htU=l۶M?gV{4K3 ܷo_]ZGՂ%5Д (/E !Qc"MԹ+r[sw㋠QɨJs%ڟ; @d v99Fk >#>!m\%I9ܻwOGtBa"Q SWP#9(*Uh&d#GQ4h HH+Vtz 40K:\xQM ~(ki(,%,j޸qC7?CRSXuvڵKw#1ChpQFYrKYyzSmq8g;$@$@$@$@$@$@$Pzj񰑐AzA g-)>I$&d'"JMǑs'3gN5kMu vY1 ~C")0`Ԯ]&GߣGAS%ѥ:tM\ .-[ȅ 4RDhdr9K~`,:6ͩ)F# Z9=7"      Lr42_}=\-9!EoN*I I%gh\ x$Q쾺YK'/K\!A6):gO+I +y@(Gy @P&0#@9fyb       Br4\H.#|ל+&      p/QH PjHHHHHHH ˊ(G#5 IHHHHHH|XG5jTiٲĈWH (GC Dz\xQ|||m۶ܹswޑ Dz@!%@9RܟHHHHHHH p]f\vM֭+K.>@s3gT^]GzJ?'N+W\yKԩe2eI"4h@&L 3gZjy9Gr4]sHHHHHHH.G7n(ǎ5jy6mYC<޸qC$I)]v#J(z(_0aB9}ČSҦM+Ǐrva>sѰc3 D nL&NhѢ+֭G￯Sɓ}HҰŠ u2x`?1sM24jHƍg{2UT5k9sF~gz$R!%IHHHHHH";QDXN:U:v쨣)TDu \?4itA^|*G 5Ո_{9Q'JHVE$w}k/_^  +W J O8q'(G5 HHHHHHH–[hht'|b`D/tz Ez:(&9Q(`t(W{9ZT)֭L8QGb 5JPTE\r auxvwuEHHHHHHH 2Tuc Fz?KHLHE#9={v-@X -^x2fs,^XۧK -[V7oE1 @x.]Sz#$ q߰Xs/UTވs^(-A$@$@$@$@$@$<.Gfm6fnR(Gk%J={ӵ@ŀzG9rVZoTZ5>g xRn߾]G|:tH3ʓ'./_1pnOPuy8;+Vcǎ ĵlR,Y"+W~!T'CM>L~ҢEPjMϘ1Cݫ˪HBו=;vl=7HbŤ^z2l0BCdK9Wٳgwߕ;w%     p@r$>yv*,YrDXQ((rN:!xh &LkctP`;m6l(Hgj=_!!)9 yӥK]7!s̑~Icǎɇ~(6m҇|@{7gl;vu9ڽ{w)T\|nYiӦɏ?Q%4CY ZڧObƍ+Ǐ7o^]kRJ6hh\!HHHHH&V9 K1i2<с[n j"JH HD W2(mҤUA_&nA xB>}TG6C@[ȑ#e$ׯ믿"_ QǏעFt\Lo߾-ɓ'ٳgkh"G]{ɺuZ@t6~F)Ɵ86-悿O<֭[mKAC8DB._\Kwu١TF4O}왞+! @;˕+(Zۀ+<\ӧkjwcA}Lu2/t3f9D"bq;u$ժUw}QkQG%6F}e֭[H6}1@#bms8ڵkuiDC>w޽01آQݻ{qB##롹 ;wnoբq{aL#Z9`yXh@D .o69HHHHHH\#V9j(6#b[Q{`|0 LBbV4=,9s:… ZȿW쇳F?#- vݣG= 2HӦML2ZHE'$/9k֬ZZǖ-[l!ma9d~ƍQ{ 6px#A      <.GM#&B;I5{lÆ :j:9(FVd3$ڂ 4YBD$\Pr41/M &ԚR )j)zDl"gh~рi~H7MypL|Yf=ːzf`[q9 !G0HG,Rım`r406H%6nt\x:0op>ܵ7nM$@$@$@$@$@娣T{+sFSF;6OQԼD4}BHJHUM%JG]X/]T RkzE*>"LC&g#"$Ѵ  B Ԏl3rܪU+ɟ?&I&2sG)j" Qٲes]'RQ{iǘ#XW\r9R(bA~APLRѮ,XntVB"21w5T!"il2QN5VQ0ڿ쐼H!w8 d/G56ƐQH^ QC+~u\95EJ?_n)|. <.G $p'(Ώ>cƌ)ÈDz/Ҥ8s̩ H 4C*lQԃDM]:kC"2!\qDRH?9Q<#8661_;H*HOH,c;քD$C$$փ@^# pV^)R!G!Psu.kժ0AqgG\Q4blEWDB08jD;+Gq]͍9|HEt( tlH"!MK|Iq8D9jBh\9n5k8342k(D<AVߔ60kB܇]sCŋF/ڋ}WS- DFs(ࠆ$"(O:# P5Qi7PB@1O`rtDG D9#G! R:uj]'MzHIDt Ü1 +cK9$"PAATBg娯>$!jOBB4# L3gud#"r^*Zcn8^7o^ |Pu`3 6MXo`i(?وs6')AϑŹ hĉ699Ql|4^ 9d[#M7}.#HoJܫV9:~xBXHxSz]sD C&C8p@_DU, k(G]ŭIkxRz"#D A.&HE       Ùg!u;P; Qu\FUE)B9HHHHHHHBhpYH(Gݎ4Tz}fDHoӦ&X:!HHHHHH"!HxѹAr4b\GHHHHHHH P{BDr4D3 (o(GIHHHHHH\ N\#@9/nM$@$@$@$@$@$@$@(GyO@8%@9N/M$@$@$@$@$@$@$5(GRp"$Qxqk       '@9{)pz8m       !@95!PƋ[ =Q$N P i x Q Fr5^ܚHHHHHHH P pJr4^8NHHHHHHHkPzͥDH5$@$@$@$@$@$@$@$`OrիW#1c 娛@0$@$@$@$@$@$@$@ݻ%K,Zn۶MN<)Ϟ=Ӏ'O.EٳGZX5KMr4r_HHHHHHH *GD" . "F?~,b"q㆞qB !y._\v!oߖĉK2eN:=zt1C^zUz%f{РA2qDyu;sKK7sJ?+R&yrb$@$@$@$@$@$@$@!V95jTY`\rE6wRF -… rJyT^]rUpo$a„ҠAI"\|YfΜ)3f!ɓ'r)Q?^,ӦM#v9EҴZAQ2^g_ܿHJ$aX^;ONHHHHHHH3<*Gcǎ-M6/_ۥvr%?[G˷~DhXH9sȧ~*Xǵx$MTbŊm?3Z]JVl|.\XѧD_|!SNq}ӧK̘1ݻ̘1C?9Ug E]We L # L'rWnbiRPriiRT-]&n+I™vOkm[}D\[]Dvktd2{nƒx"ZVh5K1_Y4cR"Ws,+ErtJIq]g-..5䒞- IDATΣJ2uGO˸EԨ,pHVl9*ZTw2ZN\InB$@$@$@$@$@$@$V*G#o#.M4R|yytZyv9tzLRG"2O>`=H?t萖:tТ9cǎ(Q"-G!< ?# xb]D6o<̚Gyõ,sLPQ倫\im3n˘msLCw˒R>QѢѢFQR/ƯR":sI$wҺfQ-GJ%Dm㾳O*R2Oz{|=m,B+qj2ݹXzN\)#[19-,i8gjmX+3פ۸elT[Z~ċCG^@ωHHHHHHH{ ]gڴim&L*0 G!9׭[kgZK~1]??Cb;DPHQo9#G?[(Rq#G?;E(Q#?GǍ'o{ xJ^vWQs 6Db ɑ>|\x[a?#FwuNȹ%„P(Ѹ\ym4jCJuڞ5oTJ't[eevlIxO{:!bѨ__?k*)?t'# xDB-_\ެPns֣&hƍu4t\8yE 4[:{tETHO4@B'j,YRN8kB(P Xr{g5~wqUV_,9 Rr6$kjsLA8Y,%?6d8BOJMI maGS&|ϒkBvC1W7gV9J]=}|iy"G)r Ğg3L;UÄ'Nli¦Pk,5wuuy>aL]:ƀ]V{3z8lەSC/}=7$n?7K@$  H@$P\E<ݹndҮ]$hnk͎ɕX͆/amYQŝ>^JŔC/}&V q8A Nvgw?_\0Af=$Eg活<)NwL5! 40A`R[(7yi{U2 Wu_Rn7'ԡ}l|wB+Z6bC'U0aq6}잗NNȇ:,]FK|s!S!uH@$  H@E(r4kldLC+j!PrZ~J@$  H@$P*G+-@PB H@$  H@ʛrINQ'$  H@$  H@8щ(h{a H@$  H@Z h+HQ}7X$  H@$ PI(G[ $  H@$  HPҁ[r=$  H@$  Hk(hZ$  H@$  H@UB@9Z%m7[hS{$ H@$  H@@P,o&P I@$  H@$PU:v (G+ $  H@$  H@%--.fP6'J@$  H@$ D@9D@PVl H@$  H@ʆrl†HiM$  H@$  H r9! %Ё$  H@$  h @(Gˣ%  H@$  H@@>sBJ@9Zg%  H@$  H@(Ѳ "P6GK@$  H@$ |Q*rBfK@$  H@$P6e36DM#m/$  H@$  H@ .G~=zt=ܱ 7.h۶m+K.v%  H@$  H@|L2Iqr믿kv|F6mb9=z-+}8bfi/>`|IWꪘib*J? /RvaEJ+rrʖJ@$  H@$P *G'txm6:wj M'|cemP0mD{1\sGMAF> Q?R,r!~R?rY{KK@9ZZ^]$  H@$ 'PP9ϓ`u]c)L/OҰÐO?4XibuM9z),'n/2-tMcGy$Δ>`e'|29眘fiދ38#Ad'|_|q}7|A/|z1d%\۷z+E\&G8餓]} :*@1()!,$  H@$  H\ L;mZn햤鍊nݻ&lǏ/h U]c5w.ii9L1"w;vluQѻwc9Kr{Iғج K,իWZ{@tP.es{, H@$  H@@a M ѧO,F>(#7\n?N󩧞{.-dQjR(B9R}D+@p@^>"TyKDc9+-ܒB2,Q)ѦvmWҹr (G$  H@$  H`\o<=z-׈ _n{d#rv[r|6$ɲynƱ+eHR~gW_;LE~|s9o߾i=4-"i>qm(1JQSC=4 YKuPVx[ H@$  H@ Or%E*"*%fQʉ'((2dOׯ*5_OQ^{&QD)r+HҳC)RMnᆴѣD"S۴iSEҖ;#Wm۶3˖rlƆI@$  H@$P! *GD sLѐ1 mMc3՛{lY~Ceov~nsV!frB$  H@$ &PP9I>Da+.sc ɕ3_\ 29ߦ~U=*l* H@$  H@@QTf/_V**' `%  H@$  H@h"+E@9(L$ H@$  H@$urHB (G+tl$  H@$  H@eC@9Z6CaC$4Ѧh H@$  H@$O@9꜐@PVl H@$  H@ʆrl†HiM$  H@$  H r9! %Ё$  H@$  h @(Gˣ%  H@$  H@@>sBJ@9Zg%  H@$  H@(Ѳ "P6GK@$  H@$ |Q*rBfK@$  H@$P6e36DM#m/$  H@$  H@ T(h͖$  H@$  Hl(Gf(lF@94^- H@$  H@ (GP 8]2cǎѣcc&Ν;/m۶-Y[$  H@$  hp*(8hZa+' /SL>{=6lX2˴r"vO$  H@ T(h./]vcI&ǿy\vel/Rz%k$  H@$ !m^E'-8R+ln$G˘1cc.:t >(6lVNI@$  H@r9 %Ё%#pM7K/qlj` RV[mUza H@$  H@h~m0 -z"*&"Q"Eob-Oѿh{$  H@$ #PP9J/K (Gytl[9@.Bqg_|M7]|ݻw>8rJh9m$  H@$P$N:i͆W &]lѾ}"upՎ7.~x嗃(&,cry-܅Mlҵk"P66lPJ9zUWŋ/X%A:kcF$  H@&PP9HKc=g}<@jO/A￧%(Wrύ=:=z[owqGva1s6LGwx!G7hhFaUN@9Z'2ruIɼʍ<3裏O>$".o喸ꫣwލ\9+HYJϒܢ-Q$  H@KhrMQӃ\A?$qRKs]^6v"y>ӢSN5INi&^xx7ߌ~) '^|xwq)Ҕߑ3K㉂;LO;w.6tfm> /,r.W_}5 S!%ka#"VO?xWcԹ;/JUy䑔ޥ4Æ KO" H@$  H@@Q(6^{mȑ (mIE8hP%AuQ5W㆚ߑ=XZDEf)(EX1";abE}7mR5^SOMRbJBBXʏX`=v!R*~lh3U)Mr˘gycM?>(IPA>Dž^?cZVOd%Os95r/L gy&>Dr!曗lF[` "?[%@$  H@$  nE|59ʍ?7;c<!I9&9$24Fhܴm۶1'@g&GDWQ\ 17DJdK{7 S+QItEQ@C J)l6kSJއnƴԞ|MJB ޓ% CMrHҟ9z$\9~ʵy#T/h[C_0y*-$  H@$к ]zRq` 7Hrҝ|)qOdEpͲ{'EQ!.9 >r#G60! 9u25yOYډNKQUrQo6]w*#@p ӸkbW[.>HQJn$eY>=53rhJK)zOjH@$  H@ʅ@Q(9ؕʆ b DR Rv)7j,R;D>Q"X}lrSU=ryh>}UVY%=꒣Dd!FM%DŒ򴖚UC'->J)9XNC=V[mޫH}2'It:D#9e+rB/{4ې)6n"*x_uJB;8zH@$  H@ʅ@Qhs:שSt3]J-G&q72Cre76|[{SE~)(_ 1)q; IDATL<҇DQeDge7x#ڵkVr/SE$  H@$P. *G3Ik,'+I3QL~ϗsBJ@9Zg%  H@$  H@(Ѳ "P6GK@$  H@$ |Q*rBfK@$  H@$P6e36R_1~Oc$LL6d1餓6:SN4B+$  H@$  H (G|@7.[mڴIE9\r' H@$  H@G@9L@# ; b4m۶S6'J@$  H@$ s@%@(r9%BU?#KAvQ$  H@@)M:vݻw'M(z(Ri̘11S\ T"BGf &&zT9Z36btȐ!ѭ[ҥKJma$  H@$ &@QFň#b+ -W^O?fӚg9_|dz-$g6_jl9ڮ]㔣IUL`СƮ]V1. H@$  H2 92ٳgA;P9c=,N=ѹs~H_nO>H!*{wK.I?Mم׶&@YCym7|O?}7{Nk7zA7ވ޽{1꼐$  H@$P )\"@o?~|¼bJ+of<57pò 襗^j. | ѣGǀbvHs_믿>87]jn h1Gܺ[#^{-]t5$ H@$  H*㾮r%Pre+;O?t,dM&B)j.Kr矏{7P34SlѫW_+"ɥB V[m$Xc93kۧ(BR-2r:4'^y듣̝z(kjG}2KQjc[ CS$  H@ʇ@1 *G\檫J j"s " T%_"@{8餓 x'SNIq]vIO78\rs=k(u"G_HPD+8p`ڤj]w[o:j)=(hc? 4tMc(GK?:C:K H@$  H@Au .fI=Ej5ֈK/;&ˡQ^^zc9jyw&ɹF:tH~"GꫯND"EHT VqW^"Jk!V쪡 Qg_|El6ѣGxbРAq 'WV,Ng' H@$  H5(}](?c w3Θ"~駚lj#2\_eC>,E{&[o$zi3<8F;o"evmH{VhTέN6@}rsN|lwOt&)Nrch $PQJ@$  H@@(}]A(ҏW_} 9:Yg8dgϞ#ʴPJre_}UE>s=7E;ti ^{m+>H_v)N"inz{G6ERѣQk37e)TZ Iθ2=Дv7}v"Pіjב$  H@$ bT"H=f̘4fŵ^;-c#"ꦝvڲoOO>$QO}i%DYR&NSM5U)(&eæ;/-Gvm{%کS뮻RO?=-߾l6aCٌON9g׽{SOMu!*jY% C%$  H@$  T;bT2@B!Y"C"؝:I:l%1Z4jmY=BI:7dR6zSz(tС)3Ỏ0>E1N rO8bAۦ1&¹&ST%" 4@1>Dwe$  H@$ B(}]($qLD!D^x$*h?m6Yj{k{DIXȨZϺr7/ IrW/Nظo 6ZA|>i%FVHQ 1_\~nc;蠃Ҫe]|wӗqg}v|3p6K-T'{zR4<礍!ELL} ;~z]t҆ pUWy__a^_ve:dV|GqQG78D q<1K; Iny7ҥaN;Daӿo=s޽{s5?Y5Ý9jUVY_!]/ gS/|07{C$  H@ М\rLfKr ͕?3q/T96k}u64>_|/7D6٘7$Il͡r^W B駟N] 7|a|Y(GG>9Yijpv%wi[&yaVW>Ӕ+'•t/A_F'tRJ~Q2+1B>o 0 }A`E5L15C f sj!JmcBJ?<)seE]{JslD=ɉ;.чz(-_ v͆^|BM]2>\d$  H@@ST:bS:( E65ʵM%^#ȃalD9yR\EQ">xg"HC+Ǧn;syvZhCtM)m喋>:ڷo_h·(ȑ#y}Sl~?#bĬΚ 3|AY%2lذRp AbƁzpDP>O$1GB -%;L2ȵzQGQ⋧Lr}y>7|3 ?> 5X#=Gd r(p,CN?|뭷R#)GKDLA>}#/G՚E;#KߙBJ yW_}yép$2hg}6I9묳w$0l,رcl+\֞ƄXЧYf%vڙ&'d;_=I_9047Zk«>-fHqsz] '!sQ"vH@$  H)s_PEm>/J$47 E6oMYh̹1ѦЪc뒣JD]l6[̖$j 7LiĢ YMrF)RHN'IA~ID!-#R3BhE1yDgi<>H?Us n"^{H>O_&uD"&syfDPsl^ /CSs#B]lRuO=TʥN#l^D~"z1^ט!deY&+ `\.b C^ٗu] E#4sO} '>CgC%{$  H@eM9u uH9!@h3)ysHjn">)Qfc &GGkfKDR]+6C!i b!糥ԅCver;"눶CrT9Dy  9;HlS5>,R-Ry 鈤"”RuG#\ř##ZYZM=D2n,LJ9yr+^= GP"FDH"d&QDnf)u1 ږCP7|vm$KK,DoTN3,*'r@E˜P/QYXN4,YA#da׬2C)sQɘPz~u 5#D"ɳkϱAJ%D"sNbS5[q}mϟODDj$  H@@S4羮 y )hL669AH!eiS9L泤hPd y Dr^Js>DDJfK|-G+Rvd#D_Vz, %H."Rei=R0 gDF”E"rD\"#ْQ˲YMƓDD"(DYI[%cqDF"TDX"gD+QC"S|㤅@X"X)w3;!s, ̇y}lv1Df28LذͷH HF^$HY")͕YHuAHE@*KEV@>7Nqnɟ?1m8-`MJu%  H@*@sr!B>/2%-Ӂ)f9#0e)8Bxь,!Gn$Y:cI8zrn(L 7K+]"AH!r>7RI"G<8˕^zi#Z,HT&\$"EYBN}jjD! $N5y"G_Df;sgy;3YH1Dϒ.D "7+\rfg"_+ .`:lF"~UVX"OTgD馛.q ѩor"8)6΀ҷ\4=D%cO]Y]טriH1/-+Df3h}@gPhCyZ&'_Ǡ~2,ښkI'_^K@$  H6Q$PC@9dh,r"?H8#+XvF4%g# Aְ!ED!сDdeM[FF%YVMz|C !J'lI|]crg1)x"yMJ?t#ÉԄshnڌ\du}>)r>6^gglI@$  H ;b9:=_%"- l]rC4#Dzn"C[=†,f91D"87HW^9-Ͷ69$ۉ%/)gD R|ĈQr2}E_"@ԇYR Wv~GB#fByMg9φL',4vY=r6 [QHBR G'- $R&bEY$K$m\d.u%E+g?$4TD(,4<)KC,?"1aS'$5Z"+pefA 9 7њ纞Un(^&M/6"5粥FE8g#>{>> '_zȢ+m&K@$  %e%P8* Ck$  H@$  6Ÿ3rS5U3v@!ZY$  H@$  4@1딣!(GrT!Zm$  H@Zb)G[,?UC@9Z5CmG DjH@$  H@@#N9"r$-QML_& H@$  H(}rS5U3v@!ZY$  H@$  4@1딣!(GrT!Zm$  H@Zb)G[,?UC@9Z5CmG D7ވ޽{G6m TH@$  H@@K7n\;ѧO^R9ZPVV ?~|駱eI& ~<I{Z)G'TCFǎk׮Us+ H@$  H 92~ٳgA;-(N+k|K؂%z Yܢm.9ϫVG 2$u]t1Z'$  H@*.fԨQ1bĈob'/hieرc "F3FҶm6r< Hm,UҮK@$  H@hVv޽b(G[dH@ G ]]b-hX$  H@$  H@F@9Zm#nEQY#&&zT9ڬ$ H@$  H@$PCr]vYl-9[6q*1cթ?(s߮]fqQ6 'I@$  H@$ Q;1L3nc=">`lƱ{o}ѯ_Xr%c1@`;wW_=V[mb\vtP?f}'7$?~fm%THX9Z%  H@$  H@h  9뮻BF?+bE9ZVSH@$  H@$PE *Ga}QE !#9.n#G~x<Æ 믿>_mQƍ/QB -[neL9OǛo8RrKϱ [nXfec7tS 2$^*k/h%B IDAT>8∘gyC80%ztUWMџx xԷ5\3K..;8p`MH-"^xzgu]!b^xa1S';z\1Ƕu79vi1ӧ1dBuH@$  H@$ (_V`DUt{gQF%Ϧnq,Wb;&#SO=d*q^6mCM}y~wOr64Ӥ%KuYZk%y[29D(gߎs=7=YWvux嗓=ꨣ5/:djYs'Xq,Wfc(ު-AM$  H@$  H @(R-wI=+ɧGde>{w}e)>$!ґQ!D)^*%“~9Dn;UҥKDf%K\H=z"kIQ,}u ˦LHRgmrGPSLQg;9;H[oA,,%@m1ʹ4$GÌܵrQ& H@$  H@9cIqc цȼr,'(oHK܉D.R>e?Ha"/gaEx;̤l6PB@qJD(Er9ʱ\rI$*⵮u5.T/)h9Q\E"[nkkٯ_$7gi:ٹsR,}`Y矟;䤭8rsQ6 H@$  H@$<9,#1 Sg$GkӲxd駟|5r@"D,뮻o:9:x-$sDݻwĉU",Y߽{j%5@Y^r‘q]}9Lu?Lt--m6 `v]g8Ժ!WXaXoRTE$SD.)U@mqr^ZmgI@$  H@$ r&PP9Jd#.+3 1z$KDb")H9#[ ٲz$&B^Jѥv%ȆL"E_{9VYdOk"zoLїDP"dk9!\_|Ep I6''=ܓ"/z$GޠANl.1bDJMu%Æ KѮ]toR, Xɻ2sv\]9MVM]Vx5aP H@$  H@$ (Ee?yGiZnL2qLx#GiK~X7>林E"fm iJy7\mu3ogg61HPr"GtY];w|s];'wXǿرclS}j_Sh +GJ%  H@$  H@? Tf1_ ZzrfRgBͧFM{l8i 7{ncb v-ݙ%R9Z[[k&Gsۙ;c=+kKuSD6TrDz1Ѱ0ϕ ՟r)bт#B嶜t-b/Pa,d&ٴKsSV%"2dH8K. $  H@$  7F6 o .H=NuP:9$4CM6vڵi'z$  H@$  ȑ#*@T(G IӺ$Ђ-K oFۈV1vB$  H@6D;ѧOv]9ZPV&#m9^uxbEm$  H@@1딣U8r mh/Z@1>D[^I$  H@q_u^IB (G+tlvCd$  H@@1딣U8r mh/Z@1>D[^I$  H@q_u^IB (G+tlvCd$  H@@1딣U8r mh/Z@1>D[^I$  H@q_u^IB (G+tlvCd$  H@@1딣U8r mXcf+5]ocfH믿~馛Y$ 4@l# H@$ J"P:h%*ʝlM|5|ɓ<bkVF묳N*q7줣>:>䓸馛&_~%V^yXj /,Hͩ9~8㌱|MqqUW.䒘ycoN!+?ӗ\pAL2$+sϝƷ9%6TGA^~ƾmK@$  hY @yP84}'jD(c?|ؽ{hR4;3~8_v%y]t?#.xGY +ġSM5Uj2"ґ;w.6t$VsZ_x 5+En>q'oO=TgyfEGN6d1jԨ裏[n^{%1IďXv۶m?OA.҉kVz3wܑN7|>' f;,:蠴\G{n;6nxE]4Ddi]D rAoEv!yz?>]6L;Cn!`n'SOS-Ow}=zHb6{G,Ƙ1cR{|I+Gkgk^q{SL"Z^c \g}WE " [n+nW_kq"9I/#Fĸq~%V=XLs_';Ɛ(L\F":B/q[mUJm}˕9xꩧ&W^ye_0XcTG܁=kc 6P6s$  H@Zrő{A /hMC-˕;vÇ'Q@ Y#vy۷o7{_ "&wY9眓"ZXiH>ڀ'|2$ǐ:H=+ aJchRc$y+yY[o2/NRaY_ht!$ᬳΚg#j 94D!Ő^Y6w-QE r\s͕x%GS{^zi?S<4nɇz(}ѿ@!ۈ>Lc~" J{˵9ߩ)\d9;oZ+Gkg`ibi^tQ({g4xȾ+ߑB /DUіxcI5>4N:isƛÉH@q&GIA&saC N#47z'ñD:ܹ Hڜz)Gzy H@$ -a("?:3(6"C$ z"R)0Rcs("q Þ~IчAuB %Z߲QHT+җ#)o"(R!kIҐw=V]uHd%¸ ȸS;$?{&(D9Rs=cmM";N;4"QxDO!M?YLD"Zwqǚ6" Y9hR(m hL73W6Όl8v "4~ohƎ0Bd2D2^ bF{$+w駏-2]b늨n2 )D&g2N(@+By #K#,m?)dBd%Q<$9b1x.Ե!QȜȕ,GFOD02y,;K"_Sgr4Q&VN%@YJ!Bɏ(Kjg_8ٟ_. <"+; K}4^s5k꥽ y Rr#Ks}wLyJ,b3+K.SW 7x#EN1";wR $  H@J(9f+pN7w HyVgՖs4]E ?)E"NY2adM&Gy%De˂D)B"j$BHF BH=E!PXZM^=ꨣjv9^ze5$#"fq5b@!S>7, GS{[ou/ iIЧO:#GXey۔'J/D s-ш0Q͑ri{Ls#Gjgp"@yցtHQx'7V)̆IYN^Sϲ[tx饗!Gyxk>o#"v39J^RXdw#<[kȐ!i"y]J:dt}]+GS6H@$  4@EQnfJ׮]S.;n,@ (Gά\hE U;x$Bx9z)H?rHDE#ShPE&-'?(~#,7v"ؔtEnVmr,F@!f,Fe9-,c㏃1a |#R ,@zlF½qY͒j K]qH,(ѧsN9'7tSʗIu h;!?DZf9V̥,& jHHQR7Y#&9+Gk'FDE+]Zd)#ie]7D%љD`Ic())!J)DL99J{@9ZܬD"aEoi|lE5YW$wr-^vل%(͝;r4$  H@M%PQr%]$fB7jџUT(:&'67NXzAD|1m2hnV,HP"4GJ;"ÖYf$وrfK?&r"Q$"Y&r&"T(,"TH!q,%jMpT(H?5-r3F"^%G%cF6"j7wzc,2Yc 5?KGDyC9!?d*}4Liw{#ҮrtEM˾쫭Z[\9ZW;YOX𹊀$rI"-ْw*_"9@eږRxac)"{Bi9~#$'b<_rby=ܫݭI !c)u1;_@#JqD}3r?$  H@@ TES\XܠX#CfZ|M ˡčh"vh]wݕ"dƗH8%D7 I:hР}|ȍ"{6(چ'1,d/ܥ5UѺԕ5p>I42QZeR"?[" H@$  4LuL,_N[o5E--Cزkk/lV@^7'5Hl97BDJClAh&G?dz "eE"-ʯl˖gW~ ۃb|*G6FbB1RӨz$  H@@1 .GzZGllRCe%}>lԔ,cx(} ,1bĿh~R|͖)GEڒ=U$_а{gOǖ(Ƈri3M9?^-2[,}j$  H@GutY?S"KYfNr;EIBDcW< _J/vj"G%F.6rDZ멗M!$r 7=aцyr CT$  H@$rq_Wp92o^*l@&Xz_.,gCG}4\pKg)}S$i҆my(6  ߗZjJApmcY='\BJB@9Z^ :4mصk M$  H@$PR_gϞPP9~k%0)ho PJܬqjM*' `L?!CDnݢK.F6'H@$  H@hyD5*F7_Q!KAh& ,F ֺ$PlbHAJ^hm45}$  H@ZVs {eN,6hG@@9Z l%  H@$  H@(&h1ZH@9ZDV- H@$  H@@UPV0H@9G>I@$  H@$В-IkIiU$  H@$  T%hUn a$  H@$  El IDATH@$-%}- x* H@$  H@&P: $P:p6[$  H@$ !-!hhxy$  H@$  H@'uNHB (G+tl$  H@$  H@eC@9Z6CaC$4Ѧh H@$  H@$O@9꜐@PVl H@$  H@ʆrl†HiM$  H@$  H r9! %Ё$  H@$  h @(Gˣ%  H@$  H@@>sBJ@9Zg%  H@$  H@(Ѳ "P6GK@$  H@$ |Q*rBfK@$  H@$P6e36DM#m/$  H@$  H@&O$PzQІ1Y$  H@$  H@($nݺ0r8L-Gcƌix% H@$  H@$DSN9eϨphAqZZrX{% H@$  H@ʃrzٷ1?9e3.3v1r3fL_M>G`I'Mߐw5ڵk׼J;m~<ꨣ^W{ꩧbv-YYdEUW]5ϓ}cJ\\n\+[7'X~{cѩ}?|سg +kN'N:?㏓ O6ezlPkTʞnr$  H@h wygx,)K[n$Ȳ6,-3Gu%E=RO>O='E*13&{'|w}wZFH'x"j 'K= 6r$*{4"O}ٓEzꩧ;.6Nv)_ e3,.ѮM7]){fP6T%rM|hkQ# H@$e-Gp믿~yD/$V ])ȸ/h) },mO?t\q)7<> V_}$?=7"=) f]~\lmyJrpu#Hb8dEr]2jcY-)GeP*G'vr# H@$ВZ"sO\n?sr#fmC0 i9Cc̘1ʹ7ވO<1 ܩ;ci&EaRXN&QN;- (ѢlCG{gbd;џ;SM(wyIC~w)"gH.,ڶm =Sp (9]_imPVڈRP*GK5u]hZ$  H@@%(k9#jC>(IDD#!rh<ѕ,҆MO>y*-u"m_b%RnTrxf)ʲy+ZknixiO"4Q#GYeC&"GFmrcIѣoN߲7P[f\VG&h9_ ryLQ z6f-,jk+G[WlŐm&4>{㓯FZwy]AƤw\wX~9K)_kz-8|cO;8K'mϼ'vEb%JuI&%dZZquٟ bhQ^ V* H@$P!*Bf,s_ct%E:rB$RBiS8EfSIQ)$I& e*LJ]޲^ẞ}>uO=Ǡ}0RG\Gn&87z?^x 5}_-" ߘ=p4}<9ZG%Y?k__b ~^e[VqzvɇYo~ܢi;>v킛O>@kѴu5#iv#mئ[l )Ow8XPj9 =ַQ@l4CB:t;ڵuYjmp]*m֬͜9g`hVFjvi GksD=O!Q-iF6QptGIdp G\@@LT8~lln鹿 >dfɒ%^5 SA3wb!M̋W UDUvUDm VDQlo%p)kf{v`[u82i6eOdzlԀ6+JẀ^OzH#\M6iAZGi:-S:vj;;0T Q` ;ӫKUAi&MmTF) FC,jDvͫ?+h"Z  iGa~5s;,@8ɣKߒ)pTSoܜ}*amhEO໶G֭U#U@pjב5핣7s*[a{fT{vvٚS6l֭[Zhb˾StN;.RHNTi*KmH8zh/^l*ʕ+0: @L=T0JU+7i񉄣ZW\д{GGL=CmԡԡCz8sO"J8" d@Ƅ60;̧J6%҃HE8dۧŷamVQv*PU޽8۰iU۫=ѿUN8Zjt5f5iclS~^p!`4v~MUC8i\`+WsO[|O 14wmMUΛ77lٲOW# +Vt{Uj8U9O<6l̫?'h"Z  i6| ˲N h한kՠ/aϋ8Җ\ko\~W*,}z};٫rUQ^!cDVdqF?a|nĩ~6q*]gy_32UԾ馛|#MA裏{71۷Wjj%մy%\fuIO?t_\kjR5 6|FIP>TW\a=*vC*G>?8߿[QWI8" dh(A 㲬HE8*DzYcAJxuBxKn_Jyn{^JۺF8wb=poeW(Z?(;Tb6o KlѲ5)tWnڴɃ?7k<蠃[n~ڵk{T 7{avtc97)=T-*Ӆ }MהwƘ3g<4^3k/Y̞=~Qj6Tūڬ+Q\D8@@ G3mD 'e@L,p4SZcFM3fW& M$A@hG6#rˌ &׺ԩOr5ʩNMG=@@*@8Ց$Yp4ɠ.cG G ^lWj:6:/͡u&K  DQp4FHh PeF fڋM8i#J@@ MDs` \TQѤP!h&  Mp4m<p k;Z   u8ZH{ᇭSNe˖Pk*+W͜9ӿk֬pB; Q- Я_?o>ϝw/"ꫭaÆ'I'/Ww:uX۶mlٲT^H_u[zU^׽-͛g>/^U[z=pY+N{m*P    fH qz-Bvr!F5ᨦ… /Ў?xGK.֭ZV?޽{۸q<U8:w\:{ix}3h UO81c=v}٧~jfͲ=z*@m4@@@$ptڵYwgutA' G*,Z7IZ*I&v{ۯ* mРcǎv5, >jZͩS愣>/^ݻw~ۆ ╡zo?p4 /H@8AI    RȅURŧ=ڃQ+VsӦ q UePHlȤRᨪGkժe]敥Q-/ IDATn:WTUt xU36oAB9sX^MW  *@@@H@Q{&L0cTeʕS's[s4E0^QMx|JiR5^|A7hժUNкtR+_}Woߞwy}7 eN8-#M?@@@@ }857IB?6lM)ך*H[n_s4~C)3GU9et`ڵ(Qž|I[r 0Q H:\iڴi6|p_sL2^5ڮ];_TjcCڗ_~k'Q@@@6P駟|:6 {ݺuCި'׶ņ5ZK/yWTrKz=C;kcUV"=#i6jԨuU._ܧk 1el'w Gy@@@@ B*, ~v40 `lj6g6LĪTa^pn[Іσa1 M?OG@@@u8* HyUgƆlnܸ^x_T+،wؙp4lr<1Vp@@@M h H^6lVOT@G%}@@@@ *)T|Fd"Lш E@@@] e‚A^S <%Rf}D@@@Bmp @G7f@@@%@85NSq"    (/ l@@@hh hb^    N QшF@@@f(h &    @( l@@@hh hb^    N QшF@@@f(h &    @( l@@@hh hb^    N QшF@@@f(h &    @( l@@@@ѿˊ+fEɵ7o6(Q"44( Fih+   Q %nSLw9Xd{7mÆ ֨Q#;#hCh!   @n۶xӟ:;0kڴ{Jl̘1w.ԩS0Bp4@#@@@@ IG .lF+W:*C{[l^Z5RWZjʶnݚvƗ^z~mkѢ5ooyW_Ν;[ ևz=Taˁ@"hq.    BtӦM?[ٲemҥ6}=Y{a w ,Yʗ/)T)裏݃ ʩfw}իWۥ^j{lRڪ>npR= h5=E@@@$5U7zhU)ژIAiqxf߽T՚TtuwU/s̱믿gh…3x_b*fRoM8r[۶m} &شilvE}^K.]x(pT/_/^lr]|V\9ɓMU fWn۷۴n]wejղ3fؕW^iέ[ڵkgh @@@h ~۲e*U<@b>ھk۸q\LL US?wg@ GBjik["E?cvZo{z|uŊ^ͪZUt^o {=7n <8sFIsG<<@@@"/pTȑ#TacݺuC^c}?f͚? +Wlmڴ M8z)M=z@rjY}J`QLI<2dO *o67"T *Xv;G*J{9+^WGK.=3z-Qn:֭xvqyCOgEn!   Hj8@tÆ >^aB@~G4{NZ O៦-Z4Lk]Tcz NMW ڡCoUܹs= ׯ>Ui'|i꼂էz͛6]t_6i*uU9?ٳg[bŬYfvꩧFb$M܌+@@@@X Rmn54wth̳>ýtW8pTSD*Ulƍ}ںц zfNN:vAU{}jR} G*Gi\MW8 TU*8nժ'[Uj=R̺^vjmWYv+6lz9kghf'A@@@Hj84_ABέΝ;QZ'ƆW]uvwz%СCDh*ղ IU+l8T.X'ڥ eQR^֬Y7y>|Oml8nU`;|FiSS:}yvGo@@@@ R*Q G{Ue*T娦ІGZcǎ{޽sի:S*@U4^!wrT󚖯Mt-;O>zVZ댪TpT!ڢ6)\U ڲeK_4 +X9PK.x^A K$@ XmҤ02>&X ~usc.vMӠ-}O3/@8|S   %pTkjSSz5dn{>]\^36#10rgϊ 3gذ3ؠ50҆ &ߔ;"   @v $ *s xHT6fKGo#@8G   +pT2;{_:z8r@@@^KJ(тq)    ;,G3|   \p4<ƕ"   @fX  Ͱ;    PNHhr    dh==h#   @G>4 ύ@@@@@pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Rnٲ֬Yc%Kw}Hh1   d@Jm۶ٗ_~iӦM 68QGe|V"iR!@8 U   $pwߵުUf7yW_}e[ʕ+^3GbŬjժv[Æ wըQ:]n0}t{G졇2:T{wؾkW^ynIy7 hƄ!   @Κ5>CW8sf͚{vꩧZڵC)TP!FgϞm]t6믿ރ _G>037~3lĈ֭[mʕ6dS]|Żrkh&"   @*|gM MrTAcdpᄈ~yبt6qD뮻-QFO?d+V;?p?{|_yܦMQUsܹsxv 'XfͼW^v=X|=z!ӳF.YĆn۶m}L-ZN:$;3mժUy>k}<:tiO-B8ͣO@@@@ I G .l<} qȑ)m׮m޼9N=bѾ}6gW^U'|)Lo) Gg ?ON8pVV- Gwqּys|N;͟?p@;S X G Gq]z9r%\bk׮q֤I<ͳ^x[J.(0J@@@@@I G)bGpO˗ G[hՋ|{WhF!6ӧ /jG{wg6l0kٲ*U6&,oht@@@vY *G.]jo[WzuF C=\3f˰yBGUz*TꫯZ%rUez1Xǎ=ݻURſT8պ^~=pBLx ?<4I&/b;wj*G5k׮aQ DZ d =Oڔst J5~V!rI]WFth6   F 9 ~7J,Aݗ_~i&L0TiM} TcGڨIakTUu|9*4 G5^zޥO?`A8jLMYW娪m)SO -uO^Z4r3vZ>S)*SM|+}<4ա@MkjT#{wߵ+Pø^lߝt=p4]<@@@2E Pu:͌(_}ZR*" [4D* >}bߩS'뮻.Bkܸ-[K4mQSQy睾Ā QmVipo֤{#VZ9_7ht|/6 G5_Au+=CTS^ W^{ Ut|-A@@@h $=͋A~Mf}W*P]G3A8)W 3T0~vzJMC*Cg̘a6lO=XsTk-QxIyz6ꪫ8_.38c_9LNPUŪks %,>${}XEZ[M8|S   %Ph7UPӰ~@Sᨦh|05G|ߗ/_n3g};.][DW2V[R%(@@@@)PhͤiA8jڵk"VknݺA|\;)    f6=ѾTfA='s g"    &k{˼'z/$    W#6Ѵ`@@@ H}7@@@+@8\O@ 5B@@@  Ё[/@8cL@@@@ Lp4e@@@Dp4Knfh)=B@@@ -Xo@GFɍ@@@@ KGtvG?@@@+@8^@GMDž    " QшF@@@f(h &    @( l@@@hh hb^    N QшF@@@f(h &    @( l@@@@Jѕ+Wرcm͚5V^=kܸ*T(4!dh&"}@@@@t $=]zVtiY}Vn];O@ fܐ!@@@(`}?6mXɒ%mƌ '`/~[%JN?tOp :9k֬YXd]SOٶmv]y֭[7SNι{ |gΜ0a}gַo|߃ '@81E    - QFY=8T(JRs磌N:yW^yfΜi֭!Cx۷lp ܥKzO֭[w-]qv5ءs>c=6_4I&yXOAmEi M ;E@@@ Hz8:k,=zsYbSO=t)R~\loÇn+VӏBEy O?w~l2ӧK :=\kҤ颞}{p40Ӷmۚ_=Νkŋj\:oƍ1PTʖ-kqN8|rg1qD{MA[*UuVvt M@p4,NE@@@rHj8@Q!:UtA7oc9G| J>P ڭO>{ū*?GaÆ SNW_}VXa;v9sOPUݻ_..\hwq4o' IDATr߸JuԮZj\Ͼ=>}ZMr#G ԆrsξL]}VZ{=7n < P7p4D@@@@ I GS}Jؗ*Uʾ+Uf/54;U<j^zy pwڴi֣G{mԩvuyͥJ*H}w< Gyī5Uթ Tk S?A8ڡC; $.Bh8pM~ /@UX*zk׮.]xXPR-kԨQû~,$M'wC@@@Hz8ATE6foMS}:w6iRH@K.caf'tWsMW*IK.UIlाkMRUy6on6I)0ֹ~{*UjNT*TȩTT륗^jwuUTb.V=TZ?Uڤ^ck=hÀp4cD @@@@ ) GewA@i*BE}jL{ "),=zW~[6h PW!cFohGuʕ+=dTf~Gqx'=H4̚t}U|=kʔ){u*G*C){1[nݫ}>^a}U*}'o. p8@@@@HY84E|w# /{饗<(lժUh6iR[U6 16BϭiӦR@j7n7az-ZAާЫSէ Qc*Gw!!馛|RZsTLU3؂ *UmWv6~xߐI᪖4ڥU+Vϟ*P˕+*@8Z< @@@2P hP=5;Uu-WZ啊]!\le:M6YN|7 U8:g>6֬YM}@g %5 _S,YAcÆ m޼y~Bӣ:ʧ;S9h#QFyجk4n  nݺ|?#G?}Ue5kܖ-[zmLGy3@@@@]Hy84)`THZL]* ˴ضMAۂ7 vW>y: [w~mCyq^3Nh*T'   d@AA`T aGdžd^ae όbwmlrk6#j_ G:r@@@"P`h<ua ˀvVptg8@@@]@Q'@84 ߎ+@@@@Q",@8    vѴ @ J@@@@pw Fxh:   ]p4C@ȿh@@@ @ <   iHK8:vX[zx6ydڵm۶-4 Fmh/   I -[l{XR߅ ^{5+VըQnۺuk\h  0H@@@@J?6nhsεaÆٙgi\pWX޽N:v~gN{W~{W_~1OG}u}Mʡcǎ~N:I 7Lhʉy   d@[~ҥK{XL+[ֺukJ{[͚57ް-Z؉'B ?n~WwqO?쿿{^Cos=& 7C8EMW@@@@ IG|6k,Ja}z}rlSOW_}啙16mڔpTgϞ=W^1c zgϞmwqUV͖.]|gVdIꪫLk_/ܗ8_VZ:VWP +4-C裏˖-ZjY~ck_|EZdկ_*tO?5p5jKp4\Ak@@@@ ZI G*?~>URŧwVZe-[#8vm7X)LL G'LF'l 4N:i]TUyjm"`_;U!e{*bO9;ӭG믿ڔ)SD?O4Ƀ }m֤I6{1?utꩧC=k~ᇾ$Ay&5Zvvp4;ƙ^"   @j)ROZGPQ3L -*A5}Ϸ˧_vevg̙3ǫRK =ꨣU e6lhNsE(mF@@@$=}ކ uj&m:)ڵTGJ|ʽ¿tV-zUe*55-]m6mTSUUU:tS9s]}*='S*yTvŃV{ԩl=Զ38×*}s}am޼Z5pTHͥt? ܱg    zE7osb{ *3aBƠ 3 j{ƍ}9>\U*`T@ګW/kڴ5k̫c5]^*=UyA >5 ~}-ա .UaL߼yi`Z+ G5-ΙzmyƮXCS-Izj7SuKUa:rHo3G f3@@@H@RQu:T^VjU4[*')SUy睗Q}Wr7U ;@@@v] ᨚjKz JkSţ*-;t;ֶm[[ K9TTƆ /T} Byp wA۵׃.@8}    fyu::2~L0mC`G    @ <USc+Jw+^{z   .ptכ@@    @GoǕ]p4C@@@@@ <(    q%i M@@@h#@8;   _p4v\@G>4@@@",@8    (n\o*U\@@@@ B::@@@%@8,I@ 08C@@@ ͸!C"@8-#M?@@@@ UXp4@@@2^p4㇘fh,B@@@ -(i@G @@@@ GnpfH@@@Hhy.(@8\   Y/@8Q n@@@@Juن \rVPv 1t@@@(ptƍ6n8k{챇~Vr4v5=^bUTiuV[zUXqř%@8YIo@@@@R~?I'dKI&٪U /ŋ|/w򉯽'8 .l*Tƍ'r,_hڻ#U scmڴ?<~_=ӇܮQ~aG=ܴ!Y}I}G%s@@@@ SjJ*>l;=RH7|p; e}L};ӧ_tEvW[Æ O>XU4:uX۶mL2v5է *7x&Nh6mR>}GoڵkFv%ԩSE_ֺukվz~ӧ /)obW UI&Lf̘S/b,Ybwu+=ϟ}ZO}Mf%J0›7oVZͳg}~s=sZEb+ªUf[lJag]SdI[vlv˔;ѝb$@@@@ O )4+[?XaB6^vZa;bQM5WЩ0q…*`T5߃A]Rեݺu~i »޽{{Pi?}:wʔ)vzx*5kOի/͝;n{s*G=c={YKgРAfUñc?ƆA8O/UWG޴iSoz)7^<[O<syūkp}=M:W~m y {G g9am2r4ZaKk@@@@ |I G=Z@ f3@@@(тq)$]p4@@@Lp4fh%=A@@@ǝ"L @@@@ G r@@@h8ƁV hd\   Mp Fth6   Fp44CACHLp41/F@@{SIDAT@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@Gy'hDf#   @hGC34Gl@@@@ ^pw Fth6   Fp44CACHLp41/F@@@?3(IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/ci/loader.gif0000644000175600017570000001046512672631600026476 0ustar pravipraviGIF89a lnl<:<dfd|~|DFD,., tvtDBD$&$LNL464trt<><ČljlLJL424  |z|,*,! NETSCAPE2.0! , @pHH 1M*t:<>lat 5N>08 ]&bqg'q,( ^(c,$D+E QS+zB!YT$YC'Y&TY "B)Y cY,S Y cY TYDS$E(c$ [B *cQU,}DAd'u"@cqPC { q YNEI 4ADJHQD Tre"¤ Ƙʒ" #lRTNJ )Vl %gh8`) j͇ؒasEK’,pK%! , lnl<:<TVT|~|DFD,., tvtDBD$&$dfdLNL464trt<><LJL424  |z|,*,ljl@pHH  A:A>t:@B%fCi9Y8*P@B lYbrg(r.Zc.$DR QS{B-Y'TC&T.*Y c ,.R Y c& TYC !SD$[B!@V t! Y ECuY%m V4dA sHdPd EJNE Vze$ 1clD-PgeI("Ē3hP U@l +i <LJL424  |z|,*,ljl@pHH  A:A>t:@B%fCi9Y8*P@B lYbrg(r.Zc.$D,E QS !{B-Y'T$YC&TY*Y c.Rl! Y cY TYHYC!Sl$S)$[B[2@Y#PE,2(h!ORh0AH, ҉ؘbHAPr$P0Q ĉI"Ma#F*F B,( ,4@<#lKΠA`) nKc]=K!',pK%! , lnl<:<TVT|~|DFD,., tvtDBD$&$dfdLNL464trt<><LJL424  |z|,*,ljl@pHH  A:A>t:@B%fCi9Y8*P@B lYbrg(r.Zc.$D,E QS !{B-Y'T$YC&TY*Y c.Rl! Y cY TYHYC!Sl$S)$[B!+c*Am+@Y$p8)]sQ nPaoX10H! dkì!VP$n XP`O-W"4 ,+RIb,1Y`AQ!)0pD LBb W \'"E -KТg <LJL424  |~|,*,ljlpHH:M A:u>t:tB%fCa98(P B lYbrg(#r-#Zc-$D+E QS !{B,Y'T$YC&TYY*c-Rl! Yc Y TYHYC!Sl$S)$[B!cJEm+Y$p8)]sQ n`oX0H! dkì!"P*j2R CPE&NL )A?H!)IDD(hr8L%gР`1TTEETR*0 *! , lnl<:<TVT|~|DFD,.,̜ tvtDBD$&$dfdLNL464<><ČLJL424̜  |z|,*,ljlpHH"A !:E<t:D>lf?a5҄4*0@B lYbrg&r-Zc-"D+E QS {B,Y'T"YC%TY *Y c-Rl Y cY TYHYCSl"S(C )%4 @V+B׍A , +&p4d1lFqdѠ&:*9iL@\%NLҰp ,Tx4ME4( mR^YD,9DQ(@aK/t%`8`Z*A! , lnl<:<TVT|~|DFD,., tvtDBD$&$dfdLNL464trt<><LJL424  |z|,*,ljl@pHH  A:A>t:@B%fCi9Y8*P@B lYbrg(r.Zc).$D,R&QS,!{BS$YC)RY,,cl.)Tl! cY,SYRY'l$r$[BB8X!.{%Ȳ q R!,8dˆi.nPQD!]C! ]0kC!VPnR XP`]&NxXFAThu\XДK 6x8H&@,$A"RݰdaqXC%N$XJ! , lnl<:<TVT|~|DFD,., tvtDBD$&$dfdLNL464trt<><LJL424  |z|,*,ljl@pHX&& A:A>t:LRnB `:*qՄ0 @84]br"X r.]$cBR zR !.-]'d$]C&Tn*] c.(Dl! ] c] T]]B_Sl$S)$C!+J[mJt)D H˗(7+ Y]ؐqp+éEVbeDG" ưEH#|Rd!"@<%ڠa7%D%a ;././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/solarized-dark-scheme-preview.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/solarized-dark-scheme-pr0000644000175600017570000000617312672631600030666 0ustar pravipraviPNG  IHDRdԬ BIDATxOŢ{( DuѩP2.òF@JJKeE]0Ӌq[Iflb_|?oe{Zhj=朞9s~ii1ZNJW=KH€1` ƀ1`, )ca"SlwDv[_ǔX8OCKO x&']ɭN7SF>I:=|7`[4Qx6G/3ON%|='/ģJ2ulr1 w}F$`zsB==#Z3՛>00zhbH>?XPOy>8EF߮>:@ʺhHDV.ɿ+j }Ք'WP_vWrSJtk$݋D$ uvJv ]OlI1t ]Ϛ]Mډ&=F w'ƐJ,8E䩥 ea0Z:mv4y< 1" Ċf5ڗ4tINQ\.Vy0&oa5[V)@u-]:/(ab%>%4魳$a]GHzr,`ѻV׳ŮeB 1 {0_6:orDoM8Z7B6R%]6xwWZWH:==U+]$~/I/Dٿ'[P 6: Y콷 /]l`n2K Gj-n# n-⍵mU2a]-c #[PWta,ytPP5T W\f΃%q1=4Eݫ=6X0<+2e+cq.GmZ9 {\g YO1N(o6W1{F;-UdT2re !nwءjla/9ywiY[MH ?1vZ\)ȾJoW Ju;l+0LuxI Ί'0_Ϣ#~xZfНB]h(6^2 -_z%KfuKԺ@Ak&RNyl7"~ĝ厘;S6sJͤxٲ2C=NU zcFg<fZNS! ݝd_rF x%[y x%EFULoڒBϏcaX`caX0|K>v[ a-WC86b耮uIaIsO X0caV0{;"{:-U1 ?р;}x]X$` Q&b6ɲFn@*p547ox͍)% nM%M0HJ5: .{ >4lI_̸?5WW-ݤ,B`&GC}DP7ST3[at@WhgX <5rˠ顋6|h/jg藿?)ǝaR4ɡFJj_k(!J(_ه qm3]ݲmw)%!Y:+Tl׿>gE A@vȚR/t8sj&F .dh3tі˃mQk1v.'1pʆ=|vbfr Mj$K 5, a{|D&\p͕0^€0`,  nZaX0m#|.k4 1`6 RݱD>3`XvlPeg5lUY/Oʲ"af??c3`rgi47 &l$ +d'ŧӵ#vvJD( .hsJ%f&%oYر}(zgihoGDo3@3&'Û+Vۛ`g ??c30rgi}]ZvQ{[x16$ ?MI|"k!)7{o뷳>#p8Xn$=4:ٶV}--L0ylۥ#w{+)+ TVԢq5xӃL[Îps|yn<.En?y7l/MQ4//yI`(b8k<θgbzjA+%k|\WS˝lvU1=U5(>P96_=zϜ3ܙ- ҚVg[B[kk*,tYhex_^M7bK Qs⤚ѿ][En|)1XȀ@؆)JmyQQj2DKCs`&R0˄>0Tu>;`N/WZ 6&DRq`#{`L֫؍$7fl7'DJp?8aOBQ2fӒSwBXG;$DjԿ2nI"=ͧS0Tyǜ֋[6wo&'U6B-d6/W0[,af`}WoKBt S90Bfl҄ *8 s{4eX4Q\`!` L#dh:I*^3Ch2qI҅ۜI^SiWvpi==aߵ+9^>j|좵@w;x 5"♳cW町CAzxDp&+ ȹsפ"Is;` {>mtrwy弎Wo,fT rR-%9j<5Jpn1 +;e=v_T2ڨ zJT +#;TCU`re.kMz_Hqagb&iҗ&?6Jn!QeWXp`wƮm{[G5jV/AI[ ^N jႍQMABPA2j sh{tS4!PsQ%K}9G!`?  !`xP*-O=urY&vf|e:遙UGVNﮇ, w\?m_/`Hm%X7yn{!:Q}}Q[X̖Hy:9[*X{_OʓJ NW\B*m,ʗN=n߿9Ls'_)ņ;BY esbb FEߴꐗEۖ[2?ɮ>^c,|):RLN}f>.C6lX7x)|9nB|6-2[ Sp*)GΕ[r&(lO͓uAV e7|^Ǜ9[QwϤ g+wpN"Môoݗ,NI?O3̞p] ]mL>k /^8QogmY>9Ixu<|0|_?`{1/$֊0Q}moI? FE1neOn(t70fQEцz=9SEK`3e oLxnr\@Ch Vh !;{nJzIm~~ƀD8ONM#L2z,J~^'ؙ*7Ij-St8M̹f)“O;&<:pP̅9#j۹wӹ .o :}ZuXfۥѥ-I.Mф=g.{S]c2]25?~ ǎ~{dS Z80N=ۀx`zU7 fx>2]Y}Υ.ٟp!D0QUט/MH9nW xi '^yFVB2'T%*ˑچCǮ#p}NP2ph7&t֗o-qX>F& e$fOfo;"WѾEO&Y`7 ےi ctqܜ.u`{qW0xˋX8,Qq$RYSʑ+r͙(2*s̎ 3 iCL\_Pn}\1_q諓/U薸0XDJ_f,[[~؏ h !`p4ifIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/emoji@2x.png0000644000175600017570000250451012672631600026332 0ustar pravipraviPNG  IHDRhٶDBCgFCMXBBCMU^4dJp}sW鼕THEMPZOTRZhCDF7;>*0%oQ^FtAnwÁdqxMG@eNylĔ&ɽ(e?|@0~@5Oݪ{{D|ާwbLrBҠyƽ}FKi9ZWqԯٲ߬{BN*+,>Ѭu.Эf|ӵ2_QL[?AyAF՞FB:@L}SY\zglG@s_vAzNmL\gA=CGcqyB3*_iXM~W֥|Ь034FJLGHZG@.eh" ݅cNNAܵrQVYИmwB^dgȳh,򛣧dtPAXcŞ+CeM'sLނ~dI7+P^u~u<̤wMTՕ^ɨy[0unjFӶT^cy?8BaΎx7ʱ7t$tomӤUq}[#V`xQ݉[n?dc֎gBvtRNS &-"&2A_\*MQ9=WEE߂vajTSP[rnjyҘuǶՊٳܺZmIDATx}Hg).I=u "D1&uuJB\}sLc?F,-N\{s:d[iZc-m?rlc].w%ws|=& 1LA/r2vxF7g5X*FM֡zŠk@ 8rrO[B`]?G3`#jZ} vQ/džGp ې0. ia!+4;tD#NUq0>\so'2iCXo0X'ΉZ?tNӼ<112x^Fgםzp${HoV6, ϼȥyl?:wDy9YLM2vֿOd }b(|tHŁX8b)/bt)Suy FJ^Eg23gI:G2nx#*!PYq뎄2dX-_6X鸚k?i?Wd™bSIJ+:KG뤸Nܾl}ss4ǵ7dtx,&}$&12w3LS2 i}LOR CAOΪ8 stSg&zy$Z:*\Pq1嬌?>zA{$9Nn|VƗg'Z9'H vҿOT@v>DpfM inPHO,.DZNRKX޽{}|xV yUmz)wTv3LZx2WRDZ;74|'/ Q# `I6B"#TyO;Λȉ~~"rz~ )5~s :{[n4i,f[ρr 45@$bGؒ.qF/{rqT5M*o~!2權MW9A%G)tAOɄ!MNZ]PI%6rW->tP`q`h0d)&⢎#rs_;TG4ôo8Xc‚7p1?XG\_02 f%$?4TT—źsv6x.)z Cl: yz!Fә d>ϟ' )~":Dȃi3?Zb3h _$^Q(PgLZG>/&~^˲,Q_STrZE'uSE!QEW)!VPY1d Jad\"uMIP̀BZU|@ yg5i:$3e,VS♀A $e#ud8v9th!~^9^AULT#mh~QH$*)az|Jկz-BYXZ"*Y/G-@]&6u El !U["]^ol0쨤#$sMGkduJr0iqNT 5,Lu߹}lկ@4 ^HsI^+eSbh&yBZ>x~c,o͔&5^рh^23ƥfI!$h:cVe;2,TKNbm6At^ 0M=R8c}F?tJAq`omn=vH0yY*$4M*an+Q5mtH2$`A]!}֖BB,svHOR H<$toX CЄO.$_VU3ZO`{d1AQqp"wk-XP5TIb TK*8Y,gg[m$ #qIJ*%yA-ٲX-)JFbUAVKܣ}}G Dȼ_{oR%(\/ xŒ3ȧǔB)]!aq>Hx}BB#d8G%=-qO-ǁ9BBӤ/G# |Vw~m0 /\#Pv)ˡ'y7؛#bTqi,rRތSS-7[te\H!f$ԚVlc$>u/`ў'?-_L 5+nW2PH#F}g$ԑ!' PP1#SF]V)=)"*qae.OrZ(!Rd민g(sYh,D2\Eeee[4r$raNSH/O___4uգy>*i?$^arA6dGI:B$@Ŀ_!2AH߃40 n$ F^sN>$ ғ++* aS}8c'B"!@-ah<ŪFRZ`S$#?@ID-OA. -QH\Gkx^֒FM <ݠ#A@T$*M" W×}?ݼy'C›M/瀫ҲB]zc58 י{}e?e7{ŋ`Pр$9EJ$fi 㸧   bAf?0-% "?aX^E;:eVC-Cg YW!jhBf{zw~޽w}v}3 u@ǁ4|駪@JTghvA?\ZREqmmyyb,(>P].T"/ bU.G&Hn+* Hoak+NKt6HV<yt C 8, Ād(쁴J_g@rb>dB[)RǦKxl6nmIQpD!EsAu`ۻ^sDDtYA"Nqf).͆ߕ҅CB]Yc~;vl^aΠ [5jt%e\*"!E +Z&O&ؠH0H)fn$NHsMřI2{313g9gmp i R)h_z{Gٺ4$#Y\k-F˯/wqZ.wޟ]y q&'~(VXcSo\kdGF=J< #R[NF!uD$X${U MHH9jiZ#OMSru^@ )Of_ǍFdm" y8Fša%$KvqPZBAPumX_ɟm!Y[l$+  &HHyMSg , ^P鎋( a8sDU$ZZBZ1+ Qd]Eb_':?VT-龾ط9B``AHiR">n!U Q7>0/Ԝݍ7^;%mRNz > KO_J7f@"[d:,+jj:UQ񩦦k d}+1QQcJb픱P'҉ *P=]mҰ97_uiPS&*WLaOIb {2"m*RHU{tJ6j-T# m*I -4<@rw<]/)?V|-΀ l-+2즬T߄=j8iRλ 6젅p8H9; u}wzZswW Yk&ǎGl)Ϧ7OG&$K+H1 7WҚwH߁XI;#UskFjȴWB`$~s U .Kp?RRϻCςʣYL l!D.H[N"c_DT27Ty $xHоJƣmBj|<8.# ]h#yB.TA+46Bq >l"(oylTh@NMS@:GtHK 8=M6,ab2)NX 0,gw+ alL3]N_g CB13QYKq@#2b;mV*۳ Q<" F)!A;;.ͭVbN25/8efP3SUnjK?`SsΰrLC[o~}u'^'` 8a{Vo^e|w6#ϐ gJgmHq;@H'bv(ߚZG> ›.aQC" A*"c2fyΎ>o*Mא אzFTPΐ&օ9b$#+^TU-|T^.  LJ[ڶ_cl X'wPVi'\ oHPTjHeR½hpwz]<͸C$7Dlxg DZ .il{oHqQGQYvH+A/bK%ٕ!yAE#ku8:XaN٦}v&ں˹\_ܵV[R:c7q?SG%VVkG}HW[ɝ^P=xcCQ+CPk( ZvhD!"20D`L# UNH=(@[gɏHwo'̊y(q`h&$难kj0al2JH0KH?N)uTDRhfxMt? d CH-9ߊGoiߎGHVxD@8u[FFȐ8WH#dXVf@rM(@0.F~MH^ oّ9{4@u/(ݹd@8C ɏL]܌Cʥy`xpdQ*g _="`$ GH ) 82> |}/O=y d/KFjj*D5``R =Lhq|@7w8B. #q$LB m aAyHHn8럀/rES+ 篧&nʌ;JԢrGP R%T-*ЪiNwR^-V#!f*aWj;4UvZ L@́Ri1H`g/2M6~mFU(uJ8%RJuLU |m_|qO~EL@+J3է$6;{ =h#-<gT=w>[7Qe琄5b{f,$O CTUqRM 5éefdAVpe+k ˈjnUkmuޠb1aj-s99= sq~ywx-v'6x , @ ba L~oHn-{ڍVT@2]/~-Q)_v8-3<m%nf lhLpoe ]>9$"eͻ,VC;ˀBwp5:IEGH@iG׳X.Zr6@.FvOϝtgxN?rЧud㣣rnzcq8b+23*e #NDO9I ǘA1tbP.1pthIX4 0@e@u *T UD$)FDҊ,/fA7G!-ׁ4iPr#dWw][ʡ}v"Cvf"R7A> ̱Hg$9?ͽ'ЈBޠ!ҮSuH P-vQnѬl){g28pP ,@@("M -RdH1=޽0y;KuT@:Aj{HW6?4n>Xn, ىJ*Rc)0/Xa,i }m HE'$Mt= ;pՊ3>I %QHr7 U@¾]*ʡ]"Hm q0 $T "Xk9LGyܟ4;ڍ(eoW%4B9v@j!v3@u:AvѺ>^I$u/.EX$O;i(O>.5 : A&_> >^۱qBi1~E80)囯3m!  "ҿ9$qH2av$H%#yyߺj٢Tj̎v U@z.t 7gR06Y Wش}T)h3IAb=E⣒$pɬ#48mXT6rװ~Cƿ ? Pp? Eky 9 *xt*Cv|TƴlEH&> ZeiG9xqH1S>٩WVi"] G# yTj i6I6mn'#wTCClhXՇ"@E܁J@K+.$d&5H=="ѷDC/j\%5{'Cw3iw@Gh];}'z8$5Av! l6v`cJ RaZq b_R*+5,1F<{ $ Vp$ 2 ]E0iJ KhQ]xeؑⶲDc$lrN}!M* n#*"MݜzoXϦ _8D'f 7SqW®]zqMtڕpW6HyQ(]0d$! x$) YħNIR42#O 5xYd[ytBw]lR]ҷ/o}: ?*Q9}A,TGDzN3yhT 5~';UB z jeޤF⚳C* i(d(=~BY^lϊZZS&ʋմo6F*D)y{} "NMƋª̷hҾ׸t!Zgic$iXTl lXͲoV?GZvfeybvIBIHW/ӾQ#BLHѓByvTΎO@H[͈)dHL#H6HPo۶qO^~gˁ{:4sCb7,}$ )ѣݩH AJRӍ(Ӡ=I.$Jv5& 5b!nS(2r/VUUA|jSiD$QPUC^h[1#,n]+b[:1;'QZCڲl[9ْG94H9 dE?Yu#q] tnD㐠 ׅX-ipН,@:q$%eDAPŠL`ZLر#0< ɮt;g*ǩ=U Q7)?сD@1l9vYnrCePB0W)XvoHpM" %gɼ7T\®j}U%}pG=ة@b7($O@r,*vA:HI՝_ "iisȊofFAOہHj}Hk51Ab!YSiCJ׻C)=z v'M?o{qu.x8$ugԋf̞"u=|ö3$Qr G;tH0~+0"fCR`iuH*)}. "m} Z$ #ZO@yT3mϗ|OŪ<|7Tf;׳3=a$W]ǎu~%yD@܇D'L;P `t8'!ը.ȴ;څdD72kpd i TftfA0 zi @$ AK,yvDZb & *b|T Cɛ0+! D]'$Ekn;LЧ8$eߢj,.#&ssH4A6D7Ak]L]bEJkb-{hJjZu/v[E솤Eھ=}@xNcsMR~| ڏJ!;/6QH}}])n:Bc1  iyL~{\߬@Y!z2N,Zj#ŔQ0S$idݜ0䣒^2Y$#pH4l0Oa $E&Y~^PusaiF&I$H&- E59bvģj,QnOee~oT8W smplHKPH ,HDyݖB<" cv_H<+"vPL蓎J*^ֽd.ѭK];i݉LaN@ɲ4(#,]H"Q'Z=h`J7Hɣ&MӗY}KdTӦLŁY6ck%5 ruHtG>u DjCYEѸlx]aA 7_Wq$P>i_B1x``BB[[B`a@6<*!Z!ݯH'9NGS$(ΉHGqhBHYp>WRSo;$jGSyD)l HZ۩Rwkr~ꭞ~n`ܸI$K;#p&67VGRTQKlw -8&:{X#J"ɑG5C@PoV"Ryԙ3SR=䓝My%7:)zH7A H& I$}Hhtee/@M&eg P[6}ߵ}$ {@4nYj\<>W^/H ii?U:`UzvZ HqARҾ欵IITw7ݩ[ЎqH]IEfkh3v#GNe:$x-wa>Er&NR$ ;\M]È$D>a𨸪8cG݃H>$(SJ늃$ɑ"i" H4R8Hm\VoZԇt@]cCǎMX';:B@pT03{g Drԥ}(dRBvLZ̥d`ЅDg:M.Z`qHqHYuxk4!asET]kΩImr7yU :y u~CRQwE. |+/> 3%8 nʌUq(쁔+LDZK3v8:і0ݲzC/qn@Zt2@"4 ,@d#! ȒҠ䢗4f@SE=\տt/BxԅDDZs줐eW=vk"gV5H$/"A+MDU OWGH/Kǥ]Nm7WRCmw# k$jjϠy~:GHGP< ڑ."̀^ Zٴ;s%;XQСT-.Sa(z ymEiMi'ݾgVs{ iH'   Q4N@LmǣE$2Kf_,ݒH5'_l`9?pڕԂ/rHJ9i>_Q;U^0$ ɕ7<"evK#0HbO=d~$=qjz8^mwcz]%k @ j?g|^8>,&h q1!ژS? L"mFV1D/E=A/MDoŋEoƘqvvͮG1};3ݝル7o HbHu=$Uy$ya;Q]\./!O P34JOABMZ1x?Bj(H5L[Hux<|RIZPut2km]<i$ a u $ؕ8>z{HQ%- HD\42jzȔ^6@=5=7HG0Sg{)tV1(nlC4A@4bgK؟vHa ǚZN)γS"q`Ү_xc/kzvڇvgh2hM;.(GXo$xIG7 RY#$$ʦ\@ue!fDYy3(+oQǛhX[,m F6|WaSH 2^xGL0z52tLT!.GH+J Jzy[ dC@>&eg&GH"9Q0Y.;S::7A[uUS# ɛ\Ohfgβ]:v!;Ϊۗ*پ{C6NO׈E;B]ҩ|Q]{p3w[/@KV~ 0ҿ}zܯ v~b#, ]@p E=CCC 1o߱@֘YzO}8iΞ鎉sŏzH'w~+Om gtݨsl'gq$>ogW9sH5k 1Ux9M:=JsPkzC[vbhhd?EQ3>fҐԐwcs} %CG/JByH,PyxW!;`ׅF](F 7m2@B!TEl;jV?aӥlS|px>2Ãq҉o (tu hj¨ 9CC;XP=aLVY;}M@o1u$|% R;:: M#v$7sBS+ ฝT}_5?T _1p=<%65g vM#N$ky#"HWض; A y.S)*~xPP<{RN0633sLɦJ9攞pvw| D2 H]g%tZ<`Zq$YLeè)=&NLOXĹ ;ͤiU:SJxũ4^G{ޤGyfϱ6}w.Vukq J%;Ci!kDռ.52fY\#rҢNf(G(IhlL[L\l@]P)Ælصual:́p 6חQs r.{1a\eo1"׻2 cay4"Z.\ɒ(5Biߥn,yhUDThualvE%EhZ"a9V E hk c1zҵi}pưV%v .N| HPd N$E4X$=G<<|gIT ub*bp=D5i6!:d'HR>ӄQcA04$Q}$5A4W4E!mOPHfsU/:v*=n|"wژv\y`|<75,%*IOYՊn3iCF<>`D2z$<" ϼL.PշѼ5 _*<_%bAǚE( Яo3@B).҈z Ш*\7bJ@z#rYa(z)vlcnٶHJ `8ڮ/H2o|"Q3ORGdu~~$g~@,0O0߳2YnOM 1@zM]"\v>I Av$eY_Q!=Z$S.(//ǽLn1:Zn gU6{dg6j }Ӯ5H}h/OG{Ʊ[AF:+63D"vq2!Q :zd  }v&b3I1@7P:@o=疭.tGKr)9C |Omb>6`ɑםzx4)vlS_PӅ<¯52'2@Dj Hy}Ra34 PLC /'^L>Q-L?"7F n$,g=+KW 2Iht/Lyǧ-B]C3} $?!ӈ$v JEV~" -67H%%M%QՕ\$˱HNE@jvԙ/ H N(Л{qw[ݎƂA;^dolұ[yCOBg'-7l(T.I;0 nBHHHHx?7pƫЙW33AqI⧴4?HL-807nN AL4ߘ6Z ۘC^*:*2c[6p3d I#@bF/[/bZ2Ůo$]u {.{=yL4!xkDz들{]GI H b1\^ByVnZ~}?{ɔgEjj ^KY1Z?HVJil}2E Rcv{BBZZ#E 0b $b kTVj$ք@MH7>3z)S'a#;'$DŽH$䉭 CSH71t)dCt - 4@GE= =@߭?6/nwzm D9%I"U nK@Z-Q%sD$|m2)|ؙ ܸVawى<ԥz{ ,4@x:b"Yô>a ?[/% nEq oK X,vaH64F@BÛu(`CYXAU[XTmj^AVr&@a u&hk.&}zl9.R}וZ\/!(lI3A*<>L^?鑀r(#{6I$0JL4fWZ^mHYxr"8fFο!q;Yo"vG D%IYG5zƩzhN{n5hȠ;q$¦V_Eafϒ*Zs+s@}P(dLx֋ѯoZ#jFPoHyr ǃAF.Oq,2Ŀ?b.]}w1k:@:wDprpK|U )Sdb r"A}@[\-xяܽB=bi9k rMj"C(VL }iZOʽU 2SL5kkр:=W%J?"f!ft􇠽t]OH_ͯ,+ֈNH&D; ;T[NtBlq;WM\ e?9̀hmu{(;Z^}7ulalx܊dQRwF< (0"Eo4i{$ vԒ0JĞoFH3Lm!14@@| p^Ϥ 2Jk UrA")vNLDtQ0b6/YO~Bm y pH:$RWx#s~ Th uIi~<Uj+lK"!CA0dY)3bCBEBߏI . |EqY@l!bl IJ76v+A'Rd &l h}nHCK7rj.UR $FPn;4bN__ꪼv!y[JuK^.˥_:Hbbcڬ8;aH05OPG'Q2<ϰxs 5ӢE@ҭL}tŏz%q~z_}xXރ荚 I$E륚#!ac f؃aDI$v@Y"' v"Q"E"t@hQnnTdHEBɛ? $nK2t ΃؍-c9)Х;'rTŁ7dt^}FZ;k HF݌mƣB{˓apu[%:s-X6`xCsIHDh $R55 U+HbGƀD;!bvU6mٝ]Ww^6Sj_7~M HZ _ H_i:J.]W UVWrG,t >d]rg޴G$u=c5L% 9$?oOVp(bxH Y$f]PeLc+Mcd?;~! %wHz2ĹF uSٹ@n揅HP?xt?g8D]=؄"y.Wǟw>,ԡ=GHrdd8jY"$̭ EGXMPmn!DR/~$HH؂ (b$fGDBH왋 w$] $#FѦ % j``Æ*k<QNRyW^˜n0Y'QmZ_dF{i& t¿.NMMV4 rHl~j :>Kw z Do[rH HH$\ (`g=hwSJe~%$]w*@*dIčGWoy;i6&{!!f\S@r~(^ݦ{HZOK ZIWn^pSTHu绝e~7Y}# GI#]Q-BuOb+%늩T>/֭khe7 DxGkb<;MH ¦8uPI"ɼQn EfgϳSsi~RJ:@! "<)<҅E_$](.ʍH<ݡBvm?G $"/y[H0;"-}̨'XL!uo`~vݔDb@Z>&˃4_NHBq>+ ̜Ʉ' W::TcvSEARqHStHu<ɸz4IW]I,,gQClRyHOW9ŞDJI9gL<m *XS3{-&ԑtl$0X'?mғ)) {~[F_fBeߏ$sJ]o+ ] "wƣ/kTrh!k~/Rq qTuI*sqF$q]HEZiAV,إ=l2WxUzI} f&&A†gAv+Ťle!%D $H1;y8E†dI!䉎 O8¶G<H[iI&Hnvvt' i[>C:$_-ڂ-`}њ,SMy^Pǜ)Co"v(U,\HcZɣ=oI$& 6o,gP|HR!7[l {@ںN]D#wU'ڧy BqI!e`4d+sH0"I }7pI eƀ\sHX@ 5 \+8| Hf6"w_9 G֮D 0Dbhh|ܴ)gʝ.D@z HB!$^s*Qzҥ[vLH.v8eeqYY闂C Iʈ~*&KT!\ZmFy>G FXTD:j£N4 .h?ApyaX$J ~2LJ#QnX.pݥQ:3 .*$N=\M,nNT ~ D] ?D&3Ko HIJ6Ȣ!@" Hd|)֝M@@]͐g*FC6 StkA9+Ɉ$#w n5ȟnШNIwJ$%g?yrr"@HR!K)LNuK|L69D>~z}}GB ;io V=@D9 WU $FVٱ~"}0m &%=7o~5bkbs@z.Zp**<5EM<. H0Him >XֽlY_K˲e|&U̙7>2VW1 + mkbC#|i[H!K=7 /zٰyQ8d!? siUl4w uuomՁRe%)jSQC^vS!%<lHYA$t:r;ʵ$@ |nX<Ҭ$#]G+jFB>d؀4dC@2H,ݷ߅7/C b$کE5PQ$WuHR1(q  WysJEO;Zb4_ R!;(쌫POOz_AfhXWep_S]AD%hIHK,E { ODT"75xrqnܼ!4ѱm8b!;: ZڐƦ%dgsG4eT?0q -qa!Cv/R[ HH+1A4 $ZkG #hWۊH ް䚨Nr^}5~{G?r),ZeŜJ0i&Шri@=֕@KGfM{IiKsfutHHCv!*;ظX}$d":ceu!8GD$VD!n8!A~pˁCXF:މOs%\"y VoViF:N7@ U؜Dx4U A!N 6 䄅Q:v$tqNuO)Sr,RH)Y}7u OEl]bTR-0@@ƈHW7ڂ H dv~sZQ܊YaB^4R:9t6I[0ÐM#sx#;]QD6PS_Z^"a8Iش98)((䉦B4$, Ign44 [X2:UJ wvRZ:0v)ڌP4I)`+j8+?K+j@.ĠfF7W2y!44YQCr"9vWcI~CYvBٷٽNQ|mE.?-ٵщX#C:&&9bUw&tҥcߌFu,hC2ⱺFIj7L\T ;W8$\bv!5G.Wg]Q]<][*#қP$lmC_A0LQ|/mcP@:w&Ͳpw?8$};[oqPq uȖ)jdB9lndSp M7 D5v>mA#I(ݢFB]u wL.Yn*9.߯H]t A;b7Գl$6El(s9rXI 5Me ʾ$I$[wgT-bX` o^[٪ȎbuKi׮/bJ$*}'}kUvq˾N@4Yev}w]ԭ}S;H2n4z}#Qv,d4pvoA&Tw="y*sFG!  hL*D9ȃ}`h֊&~yyTn%[H"xrIvl+~j{oxtcKj竝b93:w& Ko $})i/$eߤ}CF)12G"ˉCUÞ@R ";[kn#}d jUAHZHFys2\[0HF*}Xr A+p|B"tWFeB Gd4 q2Mm$3*;V+8GcE CHHkJB.vڅCXpFٸhQӬx`,RWG'6u=rHց$#җe Z+X4HcC1*^zMTRJGշD*YV$@b>iДv*rM $:47s"^DCQI͂rF,.sK8@R CHCA Uvbdl ,RmjGfdV_~jƖZ;qR܎;$a^W#d+b,BNgX|d@5vDbfl1 AOD:33:?2!{bVaԻN!eIf.V6p c!E-VE6K H;#,tY!)$BR$ZJ:oURuX-L#0>ɞC *c:jZ#[|uxohm ˗ FAQ~:+,t]M35c , uH$PWrHDZZRsU cCX7UWϪQ@:T`45߶$di4W}䪤z7M]*{Lfv}ioz[B̞;=^ҷlK6%iJA?Np?hsiځIC$E!C|}c{( 10|&AhbSGÚaCjx2I؞CD(J7$N<5 _eN$J#DD'|iD|eOLEzea_ac@ $4WAsUqURE"&[5A;r.p"6Tq /:vЂUen\V zgK\ "^Ѐ$ (5xf!0^]a*E J[lI<ҀDoe ؕHS8?^CklfC ~:̷r%t\''$͞1LH_b|By8MgO*~3p5$vDڥOqRިM*rvi<:;}F !g+mp~w{N~H Kc1 Q7 `jf -9315Ы*r'8#IAjoȅia ;LHFwޢ D@rمv6 1~!T˫N4 e .to+HZxO?$ph߼kX71'ntiHcs~GxÆM?!)d]'||a|<%&o9? -d4TX݅UhofWV, [j8y+sQjޑ#,HzyC38@ǣ?8A* qD&hFQ(4>5Lv:gZ^G̉4ƊqhA^tMw]4^|~4Hח ,Ze>ᐈInP~ĠhF*Iqj  Es2;o`Ac=XI I@;&vKq5M"Xd;81~mZI̊(d(S)%vv `{ A$hiKIIMЧMa7 $Aje9fQԠrH@J?UFt";}Ch:>>!m>1M<9h;_R +W;xT%-'lxNWA_Y;!Tby̎NJ<; R5g,4GE5 DQ+3X*# ɚ8*Bx"vV (jRL&tnpRd\^f妽m@æڥfMahf099$\$"l{CHrJiЎ,8~(Y] )Iv$hW 2 wڜB|[scs ׿}Jg2nEZZaHoP:48 c<<Đ@j'T0Hi@Z6f$EZܙ&u|+t)D3HI=>$="ՎֹnthG*S H qub]^/`-sn_oQW=?ꧪkT+</hlO,ۺHIJ σ٢Qު!0MSN>qjxRyw=% E@ؕ ɸ3耦ZGi}mSؼp驷z~HYR< $&n%3Hc` T-E) N";[iuA)288 ;"$0=iN]hj V./684- jYi[xYQ ߑv$lO$t~az?o|< b9,27!hAf" w[ǣB6,H`<Mm^H v:["2H4ztQ| A&6EW)Qd2K%9XoyɢcuJ"-MqWWw54E+؍rHL9yy9./+I$ &˶'η<uʣz9I4=TE{a_^FH( AKC8iI Ha4kvֽf 3O|/YЎ.$eMyZ,$-aɺttKnmxor #+k~,_ynbӳW oE"ɶ@.J$ɣ#D@j $B#d {HPQ#[EQg$ ةNj$v[aS:]l"$=: =o٧'Puye+ϰ=.*ˣcRHtJlsd;}(S&'j1H̠rG(f`􂸧3d\c⨢8记q"ĭ,ju+@Qv%ĤEJEI#~0h#WX)MjԈ!QڨE~sg;3javf03={O:ࡲd:N^oEP/ )Vjp\I7Ͱ.;YDȾ7({vcl@[|$vx' I!&"hIsY oGk CY(}g\Pm$Ciť><""4<"[Xr89P!f\/k{#"7~zQR7ɞHӶo΋ɴG2nP}<*NG``*Ű5cHRc^@҄a"U IłJ8_>.ų#Iz$o>.pϙ<" L8^< bc:a)cė^;> V,Qj7"AvD&~=(;ۆV>;(blbr/lo<"'R ZυeWN?LeN̋"bN#Ԏ~DI=-T?kjWYi~ H]g Fϔ-Wl;i{ln5n3=G, /]H:>#Sc.@"ǝm@R3f> G+~o?,\I`(0w Q a @(ai(j;/z*%hBˠlU(٭u"ȎQۼmfؘ_,oL{ι<<0`ILA,Wzp0:R7. Idm<H푑Df\qϰZ_V$s(H_IKq1 k׹f_39Hn;z^tG5x "PO J8"Q.hAچ)KWa44hUqvQ'Z˚]ݧ7p Y?  $foSEIZ=xsrWߗyE"uXAvTI1X g !pxdձ0Ӯj+쇡BH|\Sͣ,K$RouK۫?>7ʭ?>Z22"ٺUTr8Q%\vJkWmRKl91ax_~@Gnh]񁏨p3le֏ue#S]t^| H]]7o6Zf)QQj$U- Вx9Sӿ"x$ڂ~!n 1޴膣PgwȢC3aQ(U]|NK|,;^UPTYr:q dHFTTS\rWU_z˵x\zb/:*V\+/\( /|ʝ+4<oi-ITs{xoGǻ&?_h~YtŠ(WD= 0=Qepņ +%IP;UI4`qXUev˛1hL53;;XcM jIЕ5@gbꌰ|fiHS&NS.u^bXoF?lhzns9/Q4!#8C:V|HOف&VAtHh^oP<*%Nl[̷Xo5r(1 X7[![>zO]ErpDH#Z[<¯+:"̤|gXeva@<Ӡ>%]&)Q֞dY1x!p,pfXwH{)@Z@3׭ Q"=GqW\ Re  jɳMd`gz] 6Asι7W_VZhA~ * DB!.w,z2CE[Ko%[r5F 9bU3]p/þ)f ˜2,Kr1V;QHre=/iScS͵jR<3n0f7U{^\JTHFBQgX/g"Mi D}p=w9=tbrxh[fI Xr+@MMG0+t޽glx¦)D0d)-tFcjaz"0 _\p9r cz[Vfs9`qe){O?7Ae] M=G FkF;iHj2hظM<K1w0ˉl:RJKBP)NYס\֠ͣI-\V˒9_܇Ag 8n =#)ܘIX2tvS/ LeMH" U$#n-Zd9$0cG1*!5O!H@;pH/#;*j~0,zd}dgteh*,OS[U WGl][@z{3RDiZi HnX)3VnjitD]~D*G߃HQHog;H񈈤Z>${꩙_.@bX-#@ a&/H "LƇ7`OxRDGzq'CNO4#B""~1A* L",h*m$Ѹn#'ݎ7w GưA$ :Xuc@(_]S] c~k 0n; &>j Ou $P?qfޮD;ŗ%g NoI"k $G%ƜDLYxHQ^H0f<r<5]ThLW7efP/@#z@@/~J4s{:"Uگx]5G欳:D&N(;"5;94sԌ R۶g["&c1.pi~k)!iD ${ F ijP$.7΋%kx IM9zCo_(aIBB~o$Up*ܘyG/ET xrp?^'>SL?@B>^H؉;G5axBpy2=;?n cZW|`"k-$ ۏa. ߈4l3'ۮ , } N mt@zv"6_$u'zɞg폿=+#I8z9k5݆6XHv=Nͪ@>-id!~NG~/ҷgw YcR3h(@qߏkfqHu1muR :!xh邉)HyŅ~HH}1w:gMcoD ?!JDx9pD>I1 `o` P)Wzĺ7X l/Km +5 k,R&BkU ebL{?3K$nHI\#׽])uZ;Ueأdn k ưsӜ@MсD sHD9H(ϒ?KIČ]&IFrImءdʼnˆt·Ha MY.Dՙd ֽڴvD%>bbHܫ mz^$cgޜ7uk}HB H-@:q&; G,wT n-Ũkۘ4QGb֫e"1{7^# T$Aɚ'P&4ϔ]B\UX<*uRKrpG2r $l"{u5iDZB;T<o y-"NAT;s ,ZrHюdZHTb˷'shoB;4|r1=. e; FѡL"VGx@b'0[L#"$[ H<*-HU8j њ$!Tf!gpCYi-DD" ,R3DވGsHAefle=U!?1hTM*)_imGut WP6K1}x+# OA(zw&@+kKTHzU\$M(N-9'EKEu )d)H:;y}ؼi۲rHe,(uEl Hgˈ#.t>9K.Y+NҺnJ::::Zd^-8:$:n~:pg. 97ϋ}ϑH<<Ac;C,^ AL9'%|j!5lƹAxwE""Qin{UB|u,nt Aʂ ֆ<$tN&44jh~ 1 cKH8n ݍ"-b+EnEg=$[%)D蝡jG |Aw`?Ͷ-Rmv>wXf/E G)U3I%%( AMKYbg1$t$A$aq xdt~2F!H9@vE0Ha%'%H4 IPdU|(uuS<޴5s(*2,+T3>;Z0S2= B{4KT7K Gs=H;Noxyx V'>PD@.tD븹0!}Cq!`8vQXO $ Hyexp ^<$]iPI//3@!;.px= _'R59$ebk[03q Mw 5Xf53,AQRR:^8%dcڱ>gøc@<t6d H ;ϛs@jb^J:^~)oLlc $!EHsΖ%vlLliv7tHBV ,)aciY,V[$B'O@bߐ?qW9O"tޜwq#SoCJإ)5Cf;U*tm~ ! z$p!0P@sԆCxӗI HmHk껻klcXn+w <$Ž"Cɲtvg, Rr (<B@ȡPOȚwC#=ۄ_,\@8J$H4jؼx8RV#Ë73{$.4 I.uʇG)@' &st>g!e pG HYﰁd!$Dv^@@@ "D i3(k0޷ (Urj@}'5_@7P+5 :' &t xf"DoO<$\:fKJPIMJA "E" -H;ޓZ6b,H*dk j[X@Ge qޝ͖K $v07pR<ګ*t u檐_/A!(\3-0Sk:'8bʮݍZQv _@,.ٺغ$[MT)D}hUn (BJ&0H4(濟f on!Fmxg !׷?܏¬Xe/5 ~!Σoz;2Ù8ARYGȎ2G5j{1< ۀtg{뛅ʗޗ4ˣ@D;<"vOrv@Q{j~ThҤI3(E v&eH^gJ) o 'H{mevv[DwN=sY# #Y{ֶ( -(_ᅩD?DxBO ZBFHlٝ.CRv/j!;g)ɱ1yZ.0wX9cֽ =Kuƚ(i9ckcc"tm[s`,S<*p`,Cz\QHr!g:U()'L2Ok (^17h$5}" HIɸHT׀&IL9T\[ʾHHD;QРQ#>Ǔ;# Ac uB@REc5<# HO8ƒCXCsHM|K*Q; ׍AAy "}N$Y'OU: 73 '[ʁtH0H2T ͑ɷS>wGK  1tjVQcccK~:*Ę$s㑴mjį$jy{ަFlmԩoһ}琨u_9$H:+fsG6J鬨e]icgo-Ij?4r.HM 84VTC% (4 QJH%s$z@*+L! A`)x>g rHD$g -pѨ^أ,$u9Q={@J裓Lx3σHs{-裳DtHg/fm>^jV +J=A{ߩQ vsmHO6}3(!XM>wU!GsՊ=Hj\7jqHqq }¯/%+>UM?^dsyC.s`sU!AXқ90νHI/f2_nݾ-#KD%& BQDbM݃v9𛀤!i@*?Iv~! j FҁDi$Rem Q|Mk@ #UPmd! #HLAk>%HC*WzQ#N #{]cQ &.Kс$MZ;,UZ`>7H,4[4J?{1dLK`Nx䪐` ǡaT|*0$J C"2N 俟3cn(#;r4D1M?N԰⒏\k~OM4![UpəC1; ڑCҧE@"]#546F:. );RHI$A_Cz&F N|l!>y> D %Cv}1>Aq\tD+4dI6BPT0DZ|]i"u HS`ƊIwH40@H|"xD/-aVl#@D5PuqHT68^\o5rl C Cw1mqzUKuE]r)x3Im, g̹n0_R# /t2c"l3хSwwWje{v~/Yu (("9'^}|cf>"GEHzPJ= u%]c "M VRA.3.gH=:ZA\NЇCaQqH(ҲHvi4G8\)<{\l!S5O@XW(TKS cH)U+]$~2&Maw ^PM4_6tr<@(H%^dݯ xbOx? K$H4 j Э)IƐаeowl#Z}?YëCzmJyC(w$4@BS=,- sJ$D@F$nZ2ɬ𚙄}  `|6qـóϝӟa3DsRE0q瑯2u&1TIeJ7< j׮: $"epuO_~`tVUK@%! $DA_Z2s"b=;Q R9&R%1 #@]n j\,J] خqq :k;Aw;j[H~g.&4d G I@UYHq R{M5=J{IkN%3|`|&Hgoя8BH  ё"!ݙɜIPIifn"ͬ^ 5 $@ҫ~˗+ـtNށ)  ]q×Nx $C#^zy s8)[ %D4b,GR♳=uh("Z>64t**A{̴3h8VЍ"RU-_:'@R:RmЯGHk!iYfm{o!xD7$yٞG: S{H")<2b{vn\>iWlrHd ͯMj`_ɽۡ+HW#k% C c it $N;IǀF<(_xƶش=-vzZX"$RU` s .RUr@$g c!ȲK;>%Yv 1;uAw6{oIi q s2sba BUfݎ ̬Ϟ8$||f|1ՈzVj_ GH"V+Q,sBʉvBݵm{+7mj&U 6 e튫wnY],kW85C;oEcvFt{u###uҿ{@xԟ ^߁-jz_%]ʂHh 81"\А[!lh#0J J 䂊(d,ԪvUlb( %W++;PzZ89)A8r8!OI 0$-L^% x&Ix'NK=&IW\}햳uWuqIY_Lj!V@=J7eeMV"g탲tZՓ/浯x7'}C(*ɁV̕Htp1ԆAvJWn}tیMhAA[ʥ"r&Rx.t}/*׎-S#^}}b6-}ܤWYIRȝLk,0ɶv4>їee#o:vTW*u9Mvjl74!n;"qH"<,,M#v@?pt~}LmpgM߆]+IyvӾ/4$A7#ĉ](pq*3Ʈ$+7[ɀ8Br y5=kNƬ "y%`E8tб4< C8B}t;_}WS  =Uiwy?EʣxT,`vo6M&;s#oYŷJSjG`c0FG$NN5톹/VbaM]W@~ }pDWi#|,P 9tmMp(P1H0($1|Ǟ$ cmGg8NgF{Vۢ&{m2X&pT¯Xh&ͱdLP2;e˳t 248+"ůk-~tn}7 njSJ[+ D<1i \H!VYQgfi"QB#vWS_G$lїG)"j$i@:G$kӢN:-e%_JP6"E*j/w/EDRXtO@;ŰGci<{?n5+:~9F}) :.Hb7!+ **+;s͗314 ?:~Vm#\v2Dm_y@ss]-8K&{5i?Ǔ xy_HuܥtAQCH$?I*v[u0UvR "狌G,&rQ@:>A1I#;"=?sF hn8N/@ F3Dt ~Au( 4zɘcx|&/ԔMNݮם<)w>`D"[eY{smE[ tTU3n='>"-Y(,6wm[G2x]~hIQyŀ^$nɖGD$3m@K0R;o[d=7`![i+e5;Z{KXUbGI@""Hr( $ƎP?%;1}v'c"ZZM*D@BXR 99 oTn^K θ[fdNG2l2%"_`͙X#</~O' }?+k]Z0~=A$uc1<c|7C% _QZ<8iF魣R$.)ģva> H@jG<3fBݔ@JBpCA|NVk'>Rd3CZe)fw߿lsk"vX \m!{K@/i$:i~tҷBj0H/ԭxԭ 4sJPC^;>BS[V-ڐ5K+VNGaQ5hB;d.܅o7X[r_<&IRHϓ%p&!"7OOF9Z* t&sCr.*T?W`6V .* w5ryy?' H p_@MƦ>I:8wg'l2`.hKi~0?^.yE{x$dZBCEK)k׌l@>dǀWZIC{@ [>it\vbJ Q8ZCQM=QܡM5H44>iΕiL*#VYkqU=jCICu+x=Ccxh/8BAJvV-d\R*ddK,V&i2:dG<,xv@:Q.ȉFD;eC MH|RЎxdG$/S[3C肤{?.H$ TPlඨ#5 L+nz$Zh~c36pƍO dc [$Az]L'w ^~:r2RDM,dix_$ Z Nl>`([JTcwIS_=/otHT 9"; tp A Eh. A)ZZKKEŸ)ڹGDu9Q\"&2lm } -DwXY$ut>z(*:CQnC ;Hg@eC 50vc`$200612ơsyN|k}47zh1]WW< _:t{29q+|I}rHN>D9%g}wtigp˖N=XGHU#"e$dHۂGRw)t1C+C)$#"RZD5_MD@:lGd,d# kUJR!=͌0CN1{P΀p0uA͔CRʉte:qtpzf/H0",6o8r i^fy>,]EFS)q*;C GH=!@~r|:JGTCeH38`h)˥"f$y!JxʽDHG?ڄ_ $ Pgn Y$>$Q\l}j**Q7\G>T $yǞVV?7dvH`T`_%W.V-l~R:QπQH( 3=ڇ"COR*$_) ;lSsMB_@5)WHK>ttѐS8$^%Fb@rU@قHݪAvϩ nԈGvDR!;A$%T!l$Dۛ>>jڞ*AH6r;̅ߘ.n&-Z~Z 29&kH{ua:id>IE,dIi"f@"O3@~>q^6 HPJ]sh`{}b $Dq"co',c\_F$DiCQ?ЍDƒ̎%%DG:_sthhb)3H#o$!QNǂ]F D vyą~EL")AW%$~Se L<,<FHGHmc(NB|*[\Xod,raFw>t'uÁƒHwRՕì̠)F^_35z5@0HoEt`:fXX)aHP(kG H,~=!y;lj<^'WbS8ю|MoJ5(N*2Urp34q|%H d-ޝ& }NI@$9%+Dj p rsHVsHnq,c!ؽ]ypH$nFyy H `?zu|*02UMY勻9b*;v-Z{8ڍ8fH[Lz:#RQs.ErE! e*g8@搪۪iDWr 1 u3 AҟH!Q Å<`H HK.&h G&"M|ۥ/S]eBFꇑ\ i Ύ;M @4U!x# H =|vvL5ΒrH]o[+CRx] TD< Lv^.LgjE)K$/:.Z:2]lL#"0R̍YEԏ>"+t3G~XHN!y smao/ތDxXk}uf0,G`R:?ohrh|h6bGB5 :<>=[`):Yn>\ys:u:7쎻=]U+G".,N*yB]*^cؼyĨH5S>a |@4i"fNb_f% W)鐦t|v"=<6Fs1?ꋺ!Ud پUSP3kr+ٹQ-RjR,چ"*/Z_|(#so+Ʀ&LdGH$u?"΀ v!Cv@w$̇." tTiz"c^#)d&HI@e4|ݻcGoral(e5R>eC7$w'xd$@th"y$0mGcȮ J!QbɓeAOq4QziCbEtN4j $Xa3szIVP>9춈,N)9a<"#SEI U臀=MG@J.b|_rRp[1VX;xU/w!Q$Uv;F2ϪU?q]-GI$҂Үia)MA?obb;:-Fd- BA*L<@Ũn8NlVJti$",~)dvr'>듓̄?" Q]d 8 0ƒ!a0d_Tl>y=1 iuja4/0*j8ٙ-T$Y :a 0Sn=A5vc@i=00(/)tSDzn&R= #F3 џRo/rSM2b7ՋHo/H@m#<HK ݘ n$C$"qnhc@nm u+K9SA |@Pӽ;ΐ tҎ9Y MV1 UUGN[9^[CQڵ<}>&L!E "DDgx?MN6(}$`8)kll; ;p2S77IgDguu4 aDzVwIUU$J!MSW~J" xx$5.'nY]GhoDqz߰脋5ޓD Ei Hd7#A_QM@""ʿƪ##wiSS)bSQR}r-/+ @* _t+)+;bN>Y" hQ+oo[yhEEO_ċ"Rh.3I@SQC]R R=nn#$z\!QMHx&k 9#V;&':+ 1uA-b$;Bv@:De(Nj|UYG_5g[^[U}mmH; bvx`HD$h2-F@)jTHEPe`b~dtHƞqwH$R$$'A3\vj .}g+ݧۏH %g YY:$u@n9I8- 4rH#^#y<"T4im ;Ѝ 4I }" At4i@T@@r#vGCQ7=Q;_{>E4kCBeXrrp6,&ڪE/+^z@ "X[vϧHC\io@<(Bv{ HH(иy$Po~%ٚrkTZ- I* =vcɴr=ő*NI@ͤ={Alܻʂ@[3RMe2jѫ1bT{nzILeXd_pth_?0{ЮQcu::F}`R6@=T Sw HJie5$=鞊ClxT rƖu/+q!;$V}ʽ'k5rrEE"R?xrEF2i+"$19?QKt@JshT9$(c\ch"ƚ Hp^駭[*.? ukMt2f\vwi˾1-,d'^ =Vپ-/}s"yGHn ˃Ԫ[~_kY$A=9PPmx[TXvԮ)g(˾eʾ:* c!c m?&gkqs2J;$@v Bٗ}KDaZU;CL3? }Ϡ_" <끱Hsgccw.X{Uʩ%"Hhzg$͘a80lt  x,5 DS%cH ]jnJRJy)SN$y&{/E,zw(LA;G@wT:N H"!$6F-ɱj(YrL-AS9SD AI+9…_x8o)v8zkrɒm 'yL ǗLY3Y?:xg:Xc m x>еm%T˺1%ShڭVv~QىktkY NXMIN* ny=yzr6d7ޜx{y^`qo468|DNBnf>]0hD/pJ\/#ߠ)YHR+iA\ȽY:@r)tAGu*oGbnlV:htnM9ٴ$hB2Kc$D0  ?omc"ѴVSS"qWDȨPCAAxx.ft;EF G[a)O jhj͠RtӪf!śkk qIwӱTa qTC\{#u(}>*$H 4AÀM:/GT9gOJg|^6EwMz Slf GVԁvtT*"/D"h>aHlA1";ɪ[pu1J>کt:ʿzNO~ "A<;GtHBK RHjED D{'۠߄%v.R~%p0x!Wu(VA$ BgqՔm B1$.Hwcb<lldW͊A `6WJ$hyt0FaE<ˉHRLEXw^ 6JǏj#|D[*֥sYR!J)| $^Vss/k` !Pi GvRBf GCP%:KӪ};W5BRU!٥Ap锄v-$SZqL/jZ0ؔY\JbMG $o#"t$B@C&-CZ=-qvn:4+)-i \L:atEH|6Z%zƧڥNzqfbka 6[?W=ܐ\莟'&F$($R-A#[1DH*F52ȿC0FR-^i!ݤ t/(Qg|0* I$ύYD<-=:mCex>@Kp\%9!I9H$ HOJ#HЌj13di@zS2MMWο9'5ڃ'[H[j0[3=wq xaG@b "͵ e)Jߠ0Rcg$|If"`*<Ux8.Vr0W=C םJyqx́ES6"\:2G- [N IEKL&p!Wy˗/59~YH_~ӃrG q1|L"a:ߓ'?vϷ5H'u 87T"p2@#YCj\WEb4(MG߯!JY*$#!ᗩT[xt !+pNDc"R,Hj_ _hkV;H##].aoxw|XVH jv\E $6Z|gE.[3`>2484>о!w exLea aI$G(͡b'53N"MN~'/t k9PWw+H,=wk6 wZQABH)I`,Ҁ(67u %7BɱYxN΍ uQqxƔWǁ$(>B:ju. ċNw[GB|sJy$*gMvn_(R2-h Hȃ]V*Jl02k?_j@-$FHn^03xi>-.ր4nv7ls\|kvB2ig!P{mxm%Q]kxI5URH.rر /9v09)N℻ H0TKA tsO\z+Y#> Hΐ^]5!]<*7>E;ʳe73=,c?o?и2^_DrG0gzVqVZH7A\!o "F.zl՜qI+cro9υGx7v3ev2 J}}@1B=[- H ;Hnt"xyo}V LtHnﻴ5yn$~+sV,~ pKi͎jxu?#ӎyR\vQv#Kws48n־7 ?rUٮ$&R/ydfȲw#&#V ZxH|$Hf7 C.rR B!)2]vS>\\cl!cz;*~,^;&8n&4ۃP[j^(TJ` ګ -x'"^+4/]`c7; qD6 | d {b;G j=BExDg{$z.ӹ zWT$v.ܸoE{KPDܑ;hZ$Ȱ/;2΢I:n,!$$5()!1#Z>x4FdS~ A oֆз> * IR7ЩzeSг;׉zzT$L.'@e Ҋ5/i,Q2Uv-L~xf VōUv(q޹q=8=B;y]EtbK-*1bW6|Yyc#{%QdhaU&1xfٜLuՙ3pE FSa} G nB<1A_A >@Â{$^9=$B-e.pW5TZA,Ucô5uwv0;:kLY9M;H$aHU{5_7T0̠sp-]#jo|k,jɑ](>բxHngf vzl- iw Qlɑ_{nϚbqz0] JN_爕~2 Ȼl=NYSdiClS&_汥 {j9}n  ?ABݞkMF=f|{cFh&'veX.RݝPmK粓ۼ:>l$NlAwPu!Q( ѵ=#@ἃÞN6P!h9Ywpe*͗˧r9%vg2Pw$jR&^Ď3b.bkC{V~.qtD.ؿ^:L\m,.M/N <~- "lxxklg/j50Z8.塛G_˽*H!IjؠqMHG:/xMLVۉR2Aq1ٴxlo=Y?@"c־"Bl џУeYf A?47GJo =1F!+Fo.2#JV vsTxڐ>8Nog l<nDǃWtKGdX#4b~ 1t_}Z3W:u*!FoČLjlbuE4Ә2JC+[c7,30b(#pBYY԰V`Hjۊ'mVl Ѯ z+Ruc3:XթgFI|F9me+}BPPvLۿ[.siT*4n:T{9F!ΙPq$:uJ|ÈuVgJEPq( N"cg?|~ϫ{{nkWbs{OQ{7kzþ<<ƶe߿?0:#"HL3?- H8<RR{R̩ OQ9آH(**q9}pfE//F5PP.:0LÌ?^B^JA>DOؔ[@بB{oS/R G${D#9>O;B^|ؑ$†k3¼yA%͋#1 4!F/ځ;(tX糮Hs8/}@6J3jqN{?n- F{DHXiy#HE" S;v0 a-{5lRo:ݶ$Zk]\q>9+fkrs1؜X",mSt~e.ŢwͷwLi=]lEВ( *JO9M=SqkHNN#NRYˋURhq>x5]pFxpg1mm$)q6,i$hI'~b|4 -}DI{$"tQG7?SGD9GZ0ICH&GSD{DRUbZHPHƒT:<4X@*U6"zXpdSb+Lʧy.7(3I)'7(kSdrĖŖ)*ʷ3˗i%f$g\[5CבB돼'LM*S'= a79$X" sƈhҷbmw.sEћ IuA&/Jӫ?RAsБ"w $7+f7NMϪ8v될.agѶ@[gɏX*r3rJ,)fBdd !;8$22:11 HGPA2(єvrDؗYu3<ED**ax=H Tv7>&x2Hr@#,6&Z"պtue1v{!ߜ0"Y P ZCNiX=kPk ש8THk;RCr- f*xYO'kFsc`6Z ]E)CMI4a5X(QM$0@NE }M̮pދ^QL;R֜M>I~0Y!}&Nbe-I39 .Vt)$M"LecA$b2kXEͺLC )@UEOo(ʑ tj9oŁņ`xR<6 u I#R==6X`#;"WX†?Eim3-*};D]2' Q(s;Dv"IeYT Վ^-q*"٨ۆHGU} HT6@ڊ䓅:s= m^H 6N֐Eb)E:Ѹgrr``߾}}͞o_dGH֊5==A6ȀvOu۩ҿ9&CDŽXt= DIwHd 0p@) 0HǘyԱy[vtH RywO=-@zVIY%h~UH^}&n9 Mbvmnw^[[U .Ummynwq[~|&F$C:bQ^YrJ%1T"|իWs.ϗ@PrP&hTu‡jLx#8И#`]5D7vʫ`%Cb4zT~c_wQHPxRKI|AB l8G.fh8 :҆*J!R50 h517'xL"D5߄#W@?T?&dWYI@ P$.eT]h(X w% Im04 a~l>$ب!G!0HqS8H3 ~>Ɗ]wrȎ`|xNE $8Hi]=ir 4lc_'xMC۫ڿΖb˪ ?u>]%?XF㵃׆6AwHE2_V19#:D3@ xߟJ1L*0(dG@*ؐ6iM&H@O 3aM-J$aU<_j*..$ZyX[2)Ŝjw䔝":j"b'cvGo~ 2ꃭ&|~٣!Q39uKe'v-K@_^xooo;w:z{}&2 i$<'Rw%BA @_uW}ODBة3v<#;$!IRŬٳ87JP$in{qԎҨ]+e##" cɱ_~])}T  )6}kHjEt'NSHQxWN|Mn R8 Hrkj)ao&<'DjB61y= 5X\sh;WH:Qi.ً R pTW79oKQ;8"ɉ~ [LZC@zic,l"׃i'RO|9\7*k;yު o^{,/4Hn87 5M6c )uJImmThgR@>np?*;5m $Q7IMɐ c3d/dć % )aT_bȇR1#nPpʜbQm"vbSNGepu)G3ETx ;LB1y`vٳ e˚D:.ƟޑuF%nf^־K$R8"") 1.ynސ񉬞RuHoRH|_I.F^-~%pHp C]3 V UࡪcN(T9´Hب{pющQ5| )@$\OM) ;o'_V֐c GPKiBi+HH\0xM$H-9nSUsmiXtt3x,ucx9 eI!\79$\f+5ĭa>f8\̎"vi? ֠āU@`lݹ惆e?D&(lW9 Q*b)b=zY/C"ePn<Ie ǐA"&\P xQ9$  d1na22p#HD$VU@{ѯ .Zm Ԇ" aˋzNV oκus+5$?&rF@AAIJ)$t" vh];GX{ `Db*+*^ؐj0an\u"}xl-ܒR%C$###Y I"Y+£g0[E0@uFH;}F[kN,wc|jiSC!:!KY(;o[6q۷o":/^~i4 P=H(l~og>pُfD҃ zj /ޗ=?r,5-!oCY%& EVi{ * HXH?R Hs6@k\ۥ̍<.%2KMCݸ HZ*%e 3G sո0KG%լĮDyd $#pjH:A\CP C4޾BiE;k2|,e'a6f|z#A#QQ[?ʵka1'^-Ԣe( +0oyH|KD(6 !hfAqМ zĎ"b;bvffV)#R)T]BM0+biukoڿT@ۛE j|Q@'&nkG Uh{aB [$+(iT-}j< ߚC" y@Z H<$yߕ,6^fśϛ+\# ,-)H0/orφJc%R"#SN2e8肀'2f׉…mH,"1= 'PM0H =aW5*  H}QH@KjP;$vqC٬ƆƮb@Z^|0͸D2 $%s) .r"TF_Q7H(b$uqb,-f $lۘ~9) u'%jLs!K$wD H 1dR eR ?P H7 )AfD58Tf GdeCR 2C̄F" 7+ˁtv gQ!OJ$CygSD5zo'vG;,9$Qxa8s =u]J#H2ro}o:L O9qHYhX*NHP@” ,"M2W[@~[ :B $D<;w6x,fՀG# 1$Ht0 uҊ?ik54Ծo(\٠Guag$!@@$ꝄGC.{Ku@:xĮ"OpG4-mt@Z 2&^VeFz"̆ҷw(m8f% UXD êlb[ ,|&$ݩ(;oA2fWƞtJ,BvaqY ["£x6{2-TKtڅtFyO]P;X#tD,g]/AsP r 'u8N7&ʽD 2nUս)?b T_[Sx<ݮ͛g|o3D6[~hT-Cv?TE !!R( Pb7,9pSh! D}q"Ņ&t[}@Ad)OH촖}C@z ԨW١B>W ygvk}Oc]]c?Q06Hlq ml+ithG#R\#<`m0]R @!R-HA" QecҺ;tƫmt5[)sbX/&>Ԁ4=/.>_:*gdD;rl)ʺ\ON&dʾ Rr[(@wYQ1¬H*X@R4tYQAUv!H-\ZPK8$*G.+L5B [oM6AkH!5C?{U(d)j0R֠Cj  neGd D=_%ߛw1K▜5JeearGFvIsG瀴F!DCvF7Y!@tyCc/;vzCCv2 $5%4F5m޼y;ئ0SM-N>24B$h?QZfTTԈhDFQfD#T4N S?&9ޞ_Yw{{9i{_<}}@JB`x޻#$e{=nb`@ 3To% ZGזy6y[;x,Hq2$jc$_eRťؑHΌ5&ih{J$8T԰ @"k4аAΑ_(|1r'¥ q ijQOy9X6j E(_S"gOc <@B;B;- dش*NFIL)5ܵ찁'eX}-HF79m["!GBO-y)iڨ);%Jrx{Igޅ1aj?Ԁ(I.0~gej?Q9qS{GX᫆m?֋>.vW36ٺ$tMeHYH$JH|egUgJh~GXkcۏ"A"{7 ' tbNSO"͜&9ӟ?Nx=4HN{0I NoHK,sGfo@ko#*ewg?۷FGp3o#4TH oCGNꈐV- FI$cQKhK67'F KqS$p$yI_pXM,|PbуBvp w-Y"R@2dK)4yW͙Cb{ 3oeo`OzK+BZ%w5#oD7z>/%}_tz~j7yH(1矿yl+UAlָ~Wﲋ(;۷wRguHeGպ֎ت1p5wc {$V .N -DlN"3v].M!}k?01W " rC{{@Bsz{pK!uHR'g@t&~>yy1O&HuM%t t8IKd $HZ7:lG aFf>6Fﻻwܯbwe 9;b"@ZCJP"@~ x( cI1-mxL~(J 0VH@ly}dI0J0v]ߛuhk[1_mhn/#[F̅*,xeWmOHa$\|4M0jSjVyx&肻dIL3e$}DB%3v- =MM=r* \ zdܕ=z q L0i YinX4WFH[N ;2ڢ@ʁё@ґҦVH5p8:% $ ;sHG}Nmu@jloDʮm0F* z$W>2DB'fضkDNc# ,M.ɀeWlGI_T>ABA~`.hAA("wPA,iy0cQ:J]:hlDH\LHٔZiAzv:fX:/Bb iG頷Af>䎻/?k0HOۚSy7I馼d@v,#E'W>HNH $ucoi >4jށ uoSV2$$Ngvpi'\Hp~8o=R|Hٹ$;Q4L;p 3!O-z\DR.+ھU1%ٍWTJA=k˖]fqUؽʌC"Z: ]ht2FZkC5L \ IޱT1AP')4);-KV\c=P HuȞF("D 1f8xz6*&3oi'$PN1F Nw,zAlD}&琢tuE 3v-Ve*}tt9$HM6 5YP?y>P\U'\K Sm1{4e59.Qv5:1D4g1;s,ϥl?!B@m*Il?рEDkCbqcq5czCڛm~"EZۜD e~BC.#@J ӺAujŃNwwt-'4q"gYuHA5kK5&IW{PD9m!#7%#&$KZ_B|{EZ-7T@@RxNt6T=f<:<:tO(jh]5!5TUq]FHt:&k!]wDN !TPDXm_V]z3@X6 iUtC2zeC|rǧA$Fh.B|56Hp}T=>xh%## / XE;fDM]tP쓒H)树࢛" J<[T@¼ aU s,3[;6&̎5-7>-̍i[#02K̝MŜ\RpqӐ@_rAt4xj@ 8<Uعr>*8,ҟdQ~Q׬}z.MvtPEw`ѕV@U\fIH JoHB3.{͏AsYיDeՀ Uz)($U"ۏv%^ :KuDZvPqlaަڜsHPh6? N $ibgg9wvNt :x%њx*Ym(Hj%IYu4y LUjǡ``䯡ZqҮWFV@⬏]6W]8a3LI|=ŸG2-T,Z: q\b}*>ӏ#IrW ?߈S,BL$aa$_LЩ8 W/>yhjp[} P73vs-ZYOj+Iӎ]y`n w͡f!ޔ=}gZVߓf:] m qi!#>$;ш@>uGuvH&F I@2vFUվM 76 lzc[$"rX~ٹ|yyN N I"WnAؖ/S:D Ԅ dÈ.vp&HhJiUrtS$HlrI~]eKHGYK}tV(=]]q^y:D "(o"iQ^(| 7ufS :Wsʋ֢Ev7F"Jx:%;5JUE/&(.Nv9\#n@?#*)? +2-H;U-2`I4|nqqCRR:Xi h]Ƹ0B;ѭd@r'&rǚyiyD Y;YAl=ض]yH'M\SDTP(;u'y;H̖Bj+]_3 yT=nRE:#ɸӦ5evyG&慝T]b&JuJ@r9;l쫁CEHՙEH_n!H8˼QqMϣtuDNC#fL=H$jGHfDe_йxTc%i_U $tɒŏSHJ6߅'}# $(N<a IzU(\#2GV)rC:E.jhli'jWoJ[dIϒ5@rɶCrλ١bRq ExJy!lU!ޮQD2\LO?\82qeGϘ!8CqRX8sއBC>Ab 䂮~D0aH;V__GL M/ 2"0DK*s'Rhr++/uǷ"*M `#x̡m$ժ8"ҔgI5:ĵt~WtEVHFAj.ww|&QNaoW\J\˔MTɸ0q+bA,]'*0ٍcPpW[o)F;BBx~69;-õ阱T7>"(D.qee(.37^i&iH;o+eHgH $h[-C>x)KuKzL0}|;KaY "eI5mq HLM6#YZi`o@n hG)]0R}z#( _[ee4n)┅[s(@%yB%ÏuT!>8b!^H%?sZusj}ԯ_*fGO.QO^ 5ѐJbjf!kA>z[JAs~:Qf C*Zn NGA$<H$ GN 8c_B#!QҘNj*NvLq6`A{IPE "#)|*6Y'V QՉVfYe+ъ  Xn/ʭaQҜTщJ٥#[UP[^K/t57F)tڃV;kHU\J7W{y)* |f $[㧎idvepMd&kվ]jM򨮢. )@ _ PTUǹ;ӂ RDRak*,RfzL/0qijB`,Hrz$Q,?߽{-9rz|+_ R@$E!Hh/K@EA9q8G\T,8|-cxeW#ri)w:tg]bkti?U3) qc3hmH!"̋g10Fj׌6KY!CvfקՉ\|L'{%L} $mgȼ^xP)am.{dֲ c߈\<0 p4zrxƤM Չ 2匷 :#jy+:~Z.is5/ˊhsGv_ Aaʫ&~ݿI$F)$ݖ#\ "F2_d[^Y:bv{lf;ppCwUŸ? GlqXBTq.*X╦[8L9}6D7U_1,=xOhڴcθI 8r%ׄg'"o/CM/$R GxbtD2NSLIG~BɻNv`^(TצIU5y0R+-ˁpq%Ҡ#[8'bnxT'=@4-/ሐtiM*cA%-s+$~:#Fx(B(kZGB7 {ȻYgZHQ]QtMAӜn/'LRl\KfȱJ-h2kmvԅU'NGƔer]/h%pDHB+1y`3?/Z{,I&MVZ]oKJ?h+~Z Γ o/[.  )vZ)P;+b-:l RR:Վ*}}uOiqe|*e!ՐN_LmU9>̎WFj0peƐI$,H>rҺ:EV7UUK.I>&a,ODZx Լ7WsLw/@%=I)gə=$oTT7AB]QQ^˗WU"@M0%Ewݕ̍̈́YG?o7{vctd629w_dBn?#|tN IJ/ԕՐ|ʃw$ێ*QVQ#(u=מ)cSlKgs9 TVx! Y0Zl5ClZ&PdybZ޲Tp^K Gr#j' HǥP:.DI_QsH6Evݗt)N93Il+syGr ϡu4vWjFDTI2++/oY&GԈjò,Fʴ$e&^r~et$+\T>]hh* RUH^J[嗓3Q{QyD<,>u0rLG@1QyI NnEr&[THxP x-otL3.F{nYI;^-icqXaә-7,x||<4:~W®bn}h^¤m_{3N WUN[j^(6D޾+~yCTws#M 0}hA o"`#RLA(QQ( Q C<" HuQԼ T @RahxP;Q9~.tHD$␈Ht_lH%Lq|Kr.M3gr]+ ka="ҢwV"`Ó&h1:iY0F̥5lOra6'(&\kɘ3V|®mbVSܞL_2|!*,Ha V4=9ؿ???+05B9D=$TK@<ףּ`<юH1%QͣQ-Er``&ʷ `{I {GLJ "̡ {]LDuqDF?RN(:b"$Eq O_}'FƟ;cƌ6c ,9Iin߮g!EE᧞Ĺ[[6p:I7Hj95lt݊Q>Z|& !IO^7"qfcjBRA@2!1%8@aX;&> $U3a49X+{bz=8T%@(UtQVG%sb%huѝo?8 Hӌe&-OXd{~ U ɘ]w!>^֣^-#vDiϠ@Yf1$+_*prd5)uxHgjJ/1[3M"L< Ԏv@M# F(V' ]( <2 eW]8]"_N5J~^ra1ېh=*kAW$|@'#k&v0DqZ|A=;_P/3F=q*~$qǸE+TvIҔs2Pz!ԸwEjGH*rHJPLZV5t`"iL5KgY-)i_-H5[&z[ȩ)ntb?៷֢+ ;={ttO_hfuV!ӞHh ⟁Q ~{H&25tCghh/R2DĮklYp)!pUU0pZU7MrQ9eHe 47LS6XԂD 1U<ɰJ:$借zx":T8 vh^lAG2HΎhY.< !xH+jՐ`@55Q ԵͶ3 ޽2j7,0Zh@Cb0H9q H!-索S0vRiŅ=n (y(Ng!q UM Mi<@@zv,"|uH;&`#4DԂ4xtG*0L#n 0:<\5<<I0򨵵uik{{k$ 83! D.8+ !@Tr@Gƒ(=?CR%ioG鐨ZSnJ)RuxP|#lQ^Dםأ$M _G*x+&+fIun$.Yv򐬆='0Ia H Y&FY *)G.kzwpOikVVSvҥ-_}xAKjjoo( ihABތC! mH$-Gv׋E@bR3~=GVT#tV$'~4i;k,ѰvףF=5sLmHKKKwVb]Rjy<1?2WhzRF2MYpVeCZ4%z/ 9KEtv@c;&cW?$4Z/=xA㷵p]q}w&nS/6!TJ[ H.~]!C2??LCvxMhSO}8¤]D6þ9hi@(چ^wj=ll2IS_KysH s UuI$ Yww݅|p #0H`ҷ'| u4H +X“zA9u3g[^+E輢-f6RyޅE!*J^=)21} ֤'* Hqz|d^ԐCzn:랭TtJ{eZ vW۳ 0C -cg2"F2dqYvTZ{uR+K>$QI R`Ţ [Ӂt# F~8 y-H|P>'U/YYYzyJA{h#+""ˎi2uJ } J$MKsϴ>K"V p8Isck+jnmEÌF uF!;-L}$&v UDQN(٫'5x/:dYji:=J}i䓧>yV,MW]"ү##t<gHқt EڵgA}wwH5V{I)3R k&3vf섶CC/԰DB=䏤WtGC1I隣KYv:1 @$HH9"a4m|s~7 qkH&^ߎl=k+D:]x?Sj~& tD{iK=Z&ϐ˙t 8Ay8Z#* ~'Ċ3}\ҏccq"o%l |]bV80F -3hZ59]DžῌG}_"NO쟱af:RFN+ k+DcP #X W! x 77";h+[<\G &d0SY.f=g}|J'W鐜CW,U^xm.@4L|'OZY+Za!;>H*AkH+ݽeUAj zje H^KuHbࠠ1>{ A<Vvf!Pg`G6DrfI"I$蜟jkxy/lk۳1Ĺڲ9v{:b3Cߘ_Ѕ;5!ҹq^髎C2 vḙ0G#E6YsHmyћGu ^`_H1s; |k]$ RZS~HHl؎Xݾ|G*/x}2ɳÀ4:5 "-C:+|l`P7n[(B:&MG K۫ yl8.A#5P9H3g66{1"zi/@u%,D+KD6MrHُ@&"5 ufrRYi?.}}J/)ϧ7!? q$1|-0i}]H0&SDBGbPK3)Qd2:&7E L9i4 EYqVWghB[o{PTUǹf0 ZX3 ԔP=6:lLMir?zbc*d\&3xH`QMM4=瞻{9{w.{]w{ A#_0֟ C:ۉ ;$.dPvo pCd<'4C<{ Ꟗz[EH^VGR*&i@sMMzoFJ(7d-be&&H+Xd 0ϸn kGj"]ЌN"kDŽHQ"eK1DGL3ņFWų {QVqg%& yہ2(77 $XiOY)"HrLRH!?E~HH&#S!3J9*ڀF@q+#̹$fla@;nᢢup)BBZ`Y!}nۀԂD R[Ki H( @<:HeʧM5dR\["{Z7DT i[כ:~h 0-ҌBm3ێƬN7m' [c Jyn Q7tȸao+*f?H$ B!@5VI75P|$&V2Jԍt^oGH/SvM+4Ą.| e޶mmĊ@z,Cδ"7h髞|rd 1i~O-)؋ho<HٙP#EG5,35Dд=}zИ: &_ůG$/0<-K/}P3=2ݻhx `|W!0Wt)[~ @:2$@2ʫrRG:V!w|S L4H H*hH.6]]!)l$aw7!!/wצF*A$FF7ZUo=ή޻:^2$05 )5H 2ܗ_ȼHcyaHH[t%,#F%#9y3% 4-H#e >v}J/>8tHGW0k!Mבh $$H/R͗)O$<" AX 4;=u q9dK ~9_Ttd*m;!yHd!mȊu|XlZM{a^&پ?So1d۷JnHeLdj񱪁0oa|}1۷yO#uovs[63Xe~Ն,b$0a1zI q:U_pQ b ϒi:4膣|v@?*]W[e4$STc xn+< rx@bÅ C AO&Ɛx3$H 4p݄%܆u H*qD l0ۨ6GH<@*fn\Q> 2"}᫯8r6ʩ1 ŵ@ڻw6Db6HiRiգI]Jt> &aNdfEU$ H ~"zm⑤C$QO$}SH‚rbeyϯ,>w=?'ƒiUpNE hn\ybq40E 7>1;19Wbb,)i7E*(rb}^<1p0G#+Ui`b'^oTQ8U$赨H}hdiϷi;#*UeHNtb& EX%Jwd/=gkqVń$tRrCm3Ԃt&mWB u tP &\:ts$P\PH]:J`ASޯ ϋtP4x$+6ҒE(of!RSiW _,!iAoUH~D+d즞6K\dDbSqMv>N?,IhD! PU@UE~rx<$Y$4H( *#W׉1##8y$xSJi\khIWE$ ɪK Bu;LX쀍,vuq{rqUؽOXx/qLU]vLޗQ<=xPn&"z⪔32v$Μ Mj4WJ=@ AZ/⫯6e4b xGBN$u`. r" 9 v6 UB8zעxV]*kEmQZj$CHD:E u.{ݺl{ h##Wa1tPm=zT'Hnڪn?w (QDHA|"$;c?$j?ηONiHˆ^Xd5fRҡo3dxأ5bIH*"g<]mxtsI"hwsh ]Pq\QRYj;ݫJߡ~9eV2! S1)a'D Ap'A /ʉTbӋ;T9w qy"$g@#$} "H S|u 1)d>e •D0ղY[A۶mDXm@*CN2iO$GIRGP>+aOQ A"o  N 94)B$ Fjgős>сEtn67"$}nw`,4Lo8.7ÕW#1^^PV{=/D_,߸α}1bz,ݑ$WJ1ieKɆXѫ9h9cg\A~>c@{,z0s6#H4!X׮/BƄ]0gGwY0o\<<c&t)Gi)O'2vT뻭 $x,IeA Zia.H0b[W:|uha^ioaNjS -%m9~دcD-̕a0p[$RW&+sT\۽|HʯJңJu?y~r ^k3afEIIDe)MsxxXhk+>VHN BU H75<]߂c၆$HS C$L„9Jt A>SʮهW Z˦+Y:w EHIy(; 0ͳɷn7Uu :a @ڵchM\0 $%Z %R>߫)k2"na9"F|# fшT:fS#$fKEGn \vi-BB%lI !>^fDk/!]G5گÍԙGK5#j{{)R(/gR:<)GiΏ]-ҳu^R1)v۝)!CwBQ&9R<$c.lV؄TJ@҉܆Of)q4)B"SNHdjuCJWzʸ$UDӐ55=bTR?o߾33p|$HUcc\ljI<3"ikq#N"hRho4.LҁdF2Y wH:^QayJ  j@bVIF;b'h,/<$}75w%B&\4)Bgpъi_-1aw6eB oX"/$#"iF1bbkkWxAPXՀ- ,'7R''OOO)>z09A'Sll^ _.xDAlfzWSm%0}[yT]cDHOPA:Qke 6}I qf #' bXZ>5&f,00\Wd1MoCQ9TYM%j' 9`ik%^CHIsݸkY4s&_FsԝĥWq=Y w;^yQx[׌GLL41&"mh^,k1;f\F:$2." Acc'#Ɔz+/vT{< 2K $R2ټբ gM^ )j DJ5DR!X(7GV!HRD< O$3hDZbݯEm3HΚb>_*67ObYobgGQb(Iܿ@ Gq#!vT9H2 `J{=lyFl$SgHRIM1>=O@"Nc)׮Mo]78!n74{}S輨@ʐ:aTG$ ΞՕҤ,H)2gNE$+Xd# 1+ ќ/#lRf/IqҪ&X~MwHsT HC|λX5o`溕i@"/Cj"ianIS#TG<^@ LQ V*^O44E.uKO(T%v=J]]R{*BW}L{Tg~TgT73 EÄtC'kJտR~($r 2 Br;-@\; Š-qҶIIIma-js8{6wADRTPV"hGhIS&9 *UZ^h4G RƨǷ71x:{;; G$$͐A>dx?:a޼jxH\%;錶AO4)\]v(vdR.w፲Ldx_/ tǷIou۳VK ̻U3dF4o1qL[$uV5w {yo|}Jhu@j7L̰F=h ˛)[$ 4nBGi /Mf ˃tM,N)k)nP^zt~vnc/}쯼Avg쑏282$s $8ǕY 9HHTmi߈AP> _ݏSđfȃ>rqOBt iy/lS B R3?"όA;/~>5D"HUӑ5߮>#+eϷ›eTi7 $V&%ILH;W5R2 y KND‘Ifm%шc TG1QV_T] F ׳HB} \ q֓Gn[4&*5KiPo!Wy⩉-~{Gjqdy zgG&s\%B1D_x" *U(cP aj_Nz]T3f\[+Z#} 3^A{@ <2$= hA!La.өyp,0T)ޱ׻ӻ ckh##DֹbUsB0y tXH#$׀ Z 0>Ge!s<.ż>K\ WYIo̘HPLfTlߐ*=zo'3!?*?Y̺AkW2Kͫ?P$i~לּQ-ϛ5GuSJqkM(?qőmZJ@"/K3[)#X\jp &(& +o' .?O "LvqOMqo RpN; kkiVSF" &Yiuu v!$5ەreʺ,;-\q6ITAe:U*%%pFgtFg42I2p <[z,9" SG.-`eS qop,$@:C3:3H&YvxN^gΜmĆ M-|еK!=XP?hzɆp=ߏ^*;Dy W;gV;A?V^~v+W [Q11ěx\}/13tyaS*<: sȖ %e4JmK8N#K$ˆ8FBхBLMwQMw_Ą`ӚOكcYF)Ŧiv9N入\XurmJoglg.*T Ota~lhQr3]kn:KD}ƺ͕g>e_}vOI9\nQ 7딼]=,Lv\d$(DB {β| uUW|Rp?Xv[v= ٩&0;1@<)^35L@qЀG0iwQT (}=ǡ dǩ5],\ț/*M5QUDW0Wye{FHgjh7}9ލHEfQf lBv'б-݄#&lyf~Q7^/t^˛ N;Ma ]V4>F?ho܍n`hFж%$(IӢȓK QΜ42S7`Fd=*(P4#o /e73iA.]@vsXr8cq,[ȱ,9iť£FMMC)3_?oRo}#={ПUx{$Uu0*ZS%0骆0Bѡw3b1r`{ڿQ͕`2o{pu~,<"^>B4H$ G葐 <2`iFO<̩f@q$ D٨F0OKW^)W70Ƒ4>'6{  @:Fk&c噝8MuQ" 9XGW<<(iQo/1J6M- =Oh(wӺB"|@H)QوJ|usqW"vK;X3T<2'fШ`:$B$Nae]:AʣVqA(xIHC^=[[zJ #8ڀ]R^Mﭓ||ƶSW!;}hδKQ0L3ޔk PT- D̔ف~(SzCmϩq ~}OHkqoQ(fE/cix/^~]x@l!ƷhMuó* .KPx4g@^ AP-? CWXqfxxcYyek_Acd 6!FQIA*qC:"9W<]{jX4M4"))E|ɺD>-Z:;w?޶~~@B{ iP~J[ԡcϩu>/JD6뾗_>o 3)~ Y!`Vc;[vH+ݺA!R~hyVqn0Hgt3D:yRHt=2=B([$zAmު%.O],@J Üofi8Ȗ}Hd+@BKurwqF!͹-)g9`HD[C' X )>#{.z]&Yu]wB{0JhrT;&PjVMƦ MHcc7_'[$H{޽'މ{~A|wх؃Hߋ:McRK49 ]Ҝ|SATlh~B#JC:s#t Tg=uz<㱠Ce##`Jtĕ` "I/ .EQL"1$/(w.WGt|_qBqfҠ,&6T4ϹA*pDtj`}KH)8@{ַ֯@;o.DB!$7"d[{kDZϨxY)rA >uD5w,@q#$E9r%g$'6|   o֕@4Yhd-RF`F=HQ?T9=0yVe&ҽޢ;mE3Ɛ ;VeW_&bfh~:cj:q I2vHu UUZ]] DJULR@va ll|sqt_ٻ,0ooFĨɓRa!F? :|@ʗm==X^jj&A;j'}J >ϙtl;@۶v55=7Hm=bMkhJ;We$4HUbf8B"InHߋe&0f"eK:"sK&Pqb6C}FaئLĶm$3< ?bGcIktqFȣ]xy2kiTfIjvQ׳p!ȉӁ>zmBA&`Bz&՛Љ퍠C'>n$ɒ46J4|~9?H@Bw"y5H$;RmkPЃogFq =XGEZӱj=]8jo)(XEDE* -rS@)"}o7oIfn%_1  }$iFdT*N8OY63@2 f_5E" /d-k-:"-_+vX #O$W\ xiг좑@"=SrGrGaG)9"B龃` |-<$\fgbRpX\ʣ"D~ {\zBEd Hmf(9NMKhR.I #ךTVVfp\4ZO*#i#"\ҤGBq "d7ST ô9bW?Zn;ڴ~}ot\ R EZ&: >f@ 5!@@""v.֥4߭#wHm`嫝g sّA H#rS@F|[~)[Gp$ FUM< sr Q.]3syWV-FWI -[Px&2wh}xuj%CBhVEb oҰ> Ckiv3&Ze GWp k8B|!ИB;$ cH,C*TQxyʝ~U:Xa@m "xTOX#o<5HmSHIp; }US<⏎F,F^%"C[ϱ )ie|Rׂ O' w&H/GtX 񲑢h|mKfUw"}R;  ʳ~4 H}~AZiRCG}Sᛏ>jhԠ"ΆY="X]8apj&A"1dh}Ď'O͉ ApI MR8 q\M)GTW\yT[ CrFU $IHQ|9 qY0KZ Ƿ[J$$$F"-V8#\87Ũ Gӹ[$WH!NP-;Isa6Cgֶ$c eg#AGtHjfqWQzߝ H_% ) C! vҴnR4SE-_"@HCHd#j]w߭ %aQNq,I-L;hJ0Ǘ/_yq]_1)pP{ ; )rR$ c|$%JAgܤwV_|~\ UVvS`t',wtI-Ϊx::ŔysؤeL/{7np AFl @HoTlRbF7@_ rY b Nfq #@QjɆ(_zmOՔ(M@LO^$J"H)7H}p~d2HoCRT^tnyM(z7C9"xF@ {+@’thy3:~cHiv #yx|aC)rG@T &(֑[@:LiX_S.8e]CGya,Hiv&@B @:1 GAPĵMCA,. i/}f\[a%!s1&]`RUuGHHӧuEILut1#Cͮ7Me!;[yVOUٔgYTe-J:6 %m߃xt!$5Z IvHNgyOcD (JERboo_<bH~<~ `cg?2ԅ!k"3%xɉ) /UhDH9IO$gm9})Uw"v]Ő e- $Cdѝx[ NG2uHh@C" a^g֯sҜー~ltio+>^m$ɏ.{?v:bBxD|B,h -,9ϲ#4T G)ɴ؝A>ë~1$H"E]*UMd@,)4dA0I贋_1^U|I"]}%Rm!Nog"s"T]m@/Π)C*-́L淓Cd!gH_|[jjx r̆]/ lHIv\EE9|U*TZ^j(lߢR0LI ] ] A: H<" (,9yGΟqu9G=_u^UO' Is"$Ii6ˌ =p;˴؎{BsHwxn H7dGYG2 5T/Z$D!;}Fi8}ڹs) Ivo/Ī#d74x`r?.j?Cʦ:ߔCv4,Ȫ5@EF Z"gH!?G7MX(ZӠ}+̀Vc}se.GUD(#Q@ZB[B>kODb> iNnŸUX$$6~dA@Zy-rX 8+!'11#<$er7d71v1m MN&@]%~P] HQ!K@~A"DiR*e"yRT_$ 6@BVW Gutt:ۙV?܌G<0 {-e ir7dǑ;RR~=#GQfׯ *Y!STdN$Jj I $$[{I ;yZ2Jn4&5CrpM&9Li-kt)(Es }8$5 =;.GcHJIG'5nMba[ڰhMjkii$㛓Olü3 .)@J:4Fꀴ Z%Ԩw䢬GU (D NguiD$;E,A;#q1@:i ׁE, DFtIx0k4l'f֦ϢCWT$dЀ)@?jM(b%xd Z$Jd{TTLL-&41URE_UUQR0GPPwSmq5Kj yKj ^]vɱJ:䙇.a<J䐼bw[#Qw$}+&Gz?wm7wR +J}Ҫq7}7MҾuog{ Sqiwk%% #j5J>8XR &v#_HҽI} )sQ@j)j2ɲ͛{{w-|GX6k$1nAS6Fw*;nnb98ɰ +B-Plɽ9'*\rYʃDHjHBvk`+Hh$Ijw"+42ŇgmyH4)-55%TDgTGoE&@"$[$rHS EUTrUc ;Woi ^ QNc H Pad'B#EY ث!Y3½-7e#]Wi hblyg{h3fAcdwu;zA?K n"Mmj.$|oOnLѨuL!Rt0,녤$pbTL&b *c)ҽuJ:' %ڭ 1a|s0)*xZFGm$QUJQ̓Mҝwꗗix)z/HKH@q'ƒ$V7b%!! Jz^oQw,‘x7hZR6O# $$1M2o(4XV!m :Gj?Q:H$ǐc!@Nٽ+ uHZӼp*9Hx$cUhb@2 9Iã^}G-*+Pbpm t>6!UT@蜡ʉOJQ iF1T$:H/*DAnc6ڭA>k,j KU%~W;n+tʼn ^(qb 9)S# jeJv1 QHI+@ji}'hT-LI @5N|<hzVp@Eb Rļ3>6r CbCHY2OJpa6(-bh^fW|vN(ZXaƉJeL80Co q:!IH ڥUU!dCAԐM[:-L (H݁&۹[s!|X[gD̴DHVCՑcop#}腿B1;*2'qv(U?ʬTZP*y@ ݝ:$/ncdSǾЋj*I_\Tp848r-5TxzKfcWF%^X\D-6(zNWшw$\\aH9Uvm%2QBќ#H5KAb0o;$c%2B6DLHz5$ u 0҃RKRЊrf@I߹9dd"P_(fNf7'Z!z'_>fbO,&NLMLL2R´@o$ A&@"dj!EѦj&XC cDRLJ4@Cp@j߀ѣAc9Z %6PsMWHݢn^\ /E2l?Dk!+m?=~eJ!7OW-do26bvWh-i~žh7O (͇ FL~ қf@#vɕ&VoA;g,x.XSxַڏ.p E^˾ zucy!A:0JLQdp% Bh? cWsP);c䔓,rIv0H`D< H$=y CG*aN@LeyE;$ ّ^0w$s&2(ˮy~X6F(id2V )[l~pìxU1G Jd! Q2 i>/J_A֮ ֠353S 45ԓ___ǖRo"}$C9jX0*fǥ̣ߠ?oZ#D2?%A}]j mii691~W?$-%~A$Q%PKadjdll}j2m"H Bdh .77}k-bbQȲPQyrJȲzi:" x c3̪, Hd 7=P>j?1b!%:^!! i dL-9 IvCrQVjЗ i45EcH^+#R!#@B7GRg cj>Sq|cQ!84err𦦒}#"Y s(1kan[_ >cj s"ɳ5mDn|#{gԐQ1?.j晙u [ Mjx8>|'?[ƀģ{fYvlH}ry nDi>:BQ$ֹu~$8 bJIVliˌyg.(g 1QXƟ SdH@r$(? }1?3 hgGX?$'"#H\=T$!L.(zPHͯDžW=؟k5瑘`"}{'1D }E@jL@R™t"-;Le>ugњGH6|]?/]ydѷ߶-ՖlKݶ^O@tbMecD[H?s_4WW!-C8"}dD$(:ށֱhBU, QS=RF=(xD@BԼ[pܺe3g4;i0CKr`=䐌(cH4;5<܅JHkaBy"}p_Ɇhfo{硈cBHJ𚢬HF"a@N$4[4g"IGHBq}TK3q&BJS;Yᑆ.;x$̻Lyٟu5ڟy0syi2o썦X8&#u@顼h q: dEErǐ>UI)?첣5HcbM=i}ʮ+H)Ԡi/ H&,ʧlӠ?ь9M0.l@d]'f5 0 2&)zm<Ɏْ{nBZRڼXy7# $^\Upj:𐅅 %2i4)x}Cnޖ/IH& +/5&*{5(fEZHP*U FmlVlhUQK,V(~pT4V뫩 F?wg{gUcq3sg{9$X< pMܻ`^ten-xKΠPEwM!4~2H IteGI"B*v\HII&a$yy(xԪ<>Dmxi&j*/2#j^N;\ ~IN~K$^<2ߥZ344`kW Jkqw?h!v뒳au}Xwr"5z1﹖GViٲ"q퓝}=r9<""@#oe>*}=Г@QG3Y:ӈSi(u+Hٖ\r6цg7{MibKxJGH$H!WM$0lu됗gbGP[PAGȸHEiNsV4wV],%io55-RY,6cD-$$ᥭ܇4:µ={vXvD$A P5v>&-űhc ~{USGc`e~4Zٰot/փI$Tʳo'y0 D"Rdʋ G" D{GT {pK@kO˅3naP/+w)!VPH}?a+d_{L! .pu@$ Mzo1tAW~X0UF}Hi4NqG/'X*:UD: J e"ԵUQ c3B傣P\,OD*WK3mA.Z,/ ?_ƿV# ^$r_H[/P,^c}*3%pڵUk0k n b_͵LNgCGύ559;;46??mDZ-D.$[FitdΙ;"fEGfntOg{%+#XH^QJ)!1oJaD 4ы g,Q_x@_vCbdӥAVpb&َ2Θ<2gd-$y+{ HH"(+GHW4y0uGEI~u Qzq /8<*uzecQӎccWBccXx": 97BhGL[R& "+#|úHy:5~һ7=_j+` s  ~w>Gj@5n Hl<­HGXdC$5p*Q *ʋ<{r;2'u=:IzUk]}F[r֦ZگӌcAbE/^?L<:|S,8OW4iӫ|,Q<ώM<> ¸ei)MC}MZ!A,, ֞d}v]_rىfw aĻUI$xp3W{O<*rtdD&鵧נpfc1}'+"3ե#2y_1󼊽# W}M3ϢEPO]1S ^} zukϗ嵮kukb@s @A"_wtSwkV]ε Ǘ}σ*To? 4 'd+&C$X4-]6& CpO~}9/r~_,%&Z_Hxp*2Xƕw(UѼB g@7˃L2^ضjHJ !lT ɆHR?@[7^[pĿ5]oW0GWecg E?\D ~ez(@C cZjj1X/,{%ttcU۷^XA.25(Aqގ\0ٺm;+o/+Wu.Ҷ!R̾,m @<㲻ct}uy]vs3z6SEib+ kj y6QeOO\L;W.A%:0Sܦ7F}2U]hp$hM7\詪?).]7o).믢>ND2 [>FLѯωu3\c_t] - *Ӆ^x&4Ϟ}K PLA$\Mq~?C$S>-iBFncIX(puZRB WVA#bRu!pdk.;<+~= N/No<(V$DO%Wd(m!p}KV#[" M:Xz88'RhƆp^A-̈f$1)M DadBUAv8Tc[e[XGKpMP8RȤ;krj׬o> H-x2%ˋA?0['"⌃@ Fੲy;C Gþ qV.Nrb{nZ2i$P YUw7Z4q1$ ydh'vģᥒ kLIɯJK_p,*HYBR-@H(FD@ìZK1GK`+uH.b E &y Bi 0T28r (5:QwinW+Y` L8:KD㾴5Ǚ*7-|@Q<{;~o4#9EPgsy=C(4HdR?}hb@97v淳P254 @'ƒBjbR(d9?XC"t<>}(]yLByf.ԏ>NP"(4* .-*$$ሐD~e@u}yDۑdnxViTEAܙByLbf٥\ FXX:^6+SǥZWeFOj00%2MQ7$5>to&}z[`QNDFR@M"&2H܅cI 1HDR^Bm7,zQڿAxK@ z[ @b[G߈Gessif[⑚H#5GdFPI vAN)*18s|oݺ/3ʰlt,,*4)-,l):?&S5@"YHS1H(4NOTb|  ѷ C-%yms9S)ȎHiUwcDv/lXkrG6D*EA䖠vr !w$k;ɔ4w}S6G~#<\72HPSZ?E >W(!'/;d%F P{6z6~)| W^H(?(̸-ƟyDzG/ճHh#K4\x82PaV72,HBWZǛӤa4>Z#SHщ|2(-`*&S Rys:X%)%( Ay\ĉ$ѯ[=7\zeht`WG"HA@"ыB @"EuM\HDcD4 rq@)ğarHwrǎG۷\v"ZLǣ83:Іb6 $j4SPiئV|͆xB $_ya{ oT]eM7<6DxǻRأV'3Ǔ< NA'kTi8X$[2H8ʛ+_ouz-\^@/s)$6LW$R:D.f)H-eeDdip;a;q56o^?bYSLY@sx_恔=Dr:.1vNqtOIjS2o =~SRRI6DFŒQ[γTkl\{ ]+S ,!Ed,j| 򍄆 5@I!D@/|סFB_kxTKo#mSu&ŸГ1DAէ&A;9AmUAEZtd#3">"(ke)X@pԢi G:/ӏ5C$x?8VKHD7;s=+Za=ZxA;,pjZhW!Z`Nc2 yt:,lGJֲߺ $T qu0yE>Qyv,1߲i3mǣ5RR"g3"%+˜H6fRH|3Hw\&Ow.İtĂUlsgxz|$R:_6n*6d,JyȞ2)<EZ;:6d,LP$BZi#?2H?[_aBN''Epe`hADk$R:g"A4jN@52RHd  鲅b6c%F#_oe,$Ϩob"MLF$h(,hmφ"A N8V A _i"=1CCcfY|Z$!$Ue94GH-m5m5_]eA60[J+()ߐ ZOژ;RStbv<.&ef $I~oE[7 $2Hp"qDD3m#x+KS>U#%QNK29{e ym@B[tK 9) )PjMIZagCCáX$D1/ +$Ĭu%gG;:P{۸QGU{!cE8"#4q e xsJc# u+\׽g_,7HL2˩0H"VьΤLT8=$~H'5v׺ Nj H4;b@Իdu]DX0F<_ nL x@M'\.|J=~DDMkpkYz!]/Wp/AQ$D@B!HS`9kxi'C<`IvHB-а-e)sH_llOKGipH5ԺPh+`ZcvUZ 1 p'V폺qOܷF8Ү~ڥ{~Wʥ0Huul<պcEx̺{>O?~M2&Bጻ,Nc"q>pSΔHqH붗>.c JDe_b/Z&nE,(:XoـPA$&;}AxuHe) C]`b@a#!0H!-X#oy#s9>GY<~+n#<=r: ]1 HHȕg~Ďbvm$ az&bN%FFЏe'R>4=K!$[JQUmOٔA$)58KGXΞw8֫Q䡘QG4K锘 %,ɶFtT7K**Z3kCb -Gc B }D8E:C;¹FXhwt\MaXcOZw=c!;vڡp2$HNl6RW.Hx}O{z&'M$qW56: NeF<'yigφ ެ{ǺduWas7MM$T&Rq|`U3)=O;gn\z0G#-; )$chwt*.H TVeɨ@S)S~E]Ftq %ٗغ ?E^;N%X%<jes?yn4{x^>bq<&m ѧȁe.i+̈D+#B_He P$'6ʀY^,eHx~kT^S=0P]S8/$hS6@`{aVXMz᠃"j^ظE4!Io#&)8222l3$@D@i}/9z5G#W  2$yy]`'ťH|v2ۭp$M$e1y]v -{d)DB ݌> ? D{Վaik B>߁7_Y!ɡ#k@~+ȸi֧.J)p1y% i]8G8f}oᇳVׁ 9"p5"D:L޷g#*(rEY6CL-a9̉D@2Hz UpkۦH-C|'zy@Z@ery"vyXޮ, awMP!DD+u{v.+bj6>yq zXՉ.xw neb F@A2j9bil~n~FK{eZ"RR#@2cJ+@zԂ>وVQ-$4$%0Hi@:׾_T%}Ga"aN%~Cvx |U\*C_RTJ镅F2 >.M$\Us ]u [2Rf-@jʘn\0.  vH|ܨuמ.lr X=H5~qqqӚ|v]ǻSH;v{nąWb@2CHAQY@d#H]:݂,nf}:=>ސ=; HG<߱+$E׮_ YRFI&|@B *ᦙ $Qz VwZ`W u8آ $"OCRo4Uk^oc9>#QBnks.ed 6Y' <"ΓPlQB9Z颛3~}CZ_Dynq  Xy;#؈QC+M5-Ld'EW<$AYT=G H0Hmc`DAʘH`ĀT9j*[ **A)iFDɵлhL $}_2zy ˭: We(_! c}3F-ҫ-R9"rL9ڴJ:a1l24P@n~l`WTWi6@8bS+|$WZѯ= n@@=H6x {R$}̈D@ $ @2 锄zw+~ v(Oy63]7^T$ƃ^88$گB_}co(~[[$$->C;$e"d4$r(Nj@9i7T΍6*57}XGwac!txxsaSP-@V1#Ey<#yoz|@‰B#p"n IYF̾5z.\)77cYW| (Hr x=\C@Y D9:=)I#q H4;c05H D:"[ND$c"UR7G~}cyIG;c^U-z iQH97,`u>dv8H%zH}u};:zi IHVح_K6ڣU$ Jްu達4 ҿ3 g4YWv;Ci) sWpC? Ō2b1$Ti?N $]ň|IH%5{,m]П{SJCVZ`a5 ^G췇/["] \G:"3Ҍ)??ƃocFI 7ŝ@Hf Z4h^7d۲[ij)D"/C$$j/?kkpgz.,@r ei!t ͱ,yVn\Wx.+~ A|k^Ȟ|70=a$I H\JiR̙Y>Z~Dd ĕОMwbٞ]H+S& ~mᖂ?$T$l7M !aGwNs/}|mm-Uwz)!N% ؔ|HɦҐk Wh_sl"ou9"DdR(_'D^RΟ $#~APOP۝}vIom(?6)Ҿ#z}ẄT\a xV\ W꫿~_ $JG],e{DH 馏AYkm}0{l $VVҾwӾ$T bDڅ/}GҦ}yHC!I xKKvCKEC*TxtG/'5YDڷM;|\:2Ҍ5H"+,H3KA;Ⱥ4g|9"2$֢7:yZ9HXXnVxҾPŻ8Xβی$-3.ր<-yis͓@5~Je1J:ŵ=<$؀aGߖ4QiDm\a 5'5e.zA!oPҾIg܉ڽ(fGo\%i$@u!WT\xdfuLRҾNHRv @As;H+;k vU1tc my6'^\W_ZR|"6J_/@:H>ܱ1d&,[tr{DN #x$v_*c?kbll'z02H͡k PؚX1 -wb,1}c2 uoL~_L3tc+C!;A{{RꍪNkIHm,nlF"vG~ZQԍ H NvH_"Î)KzɔSS/ݗAG|ujYhV<c@ju#bW$$N/L̛K, !vF-c%.9dR{ |Kl?}D;.2HQN $}W$jz@BRyoxNφvyپ!5$ QNX$k0 ّ1$m.,s\cuޔ H!%dIJ|N~+ɅtfQNi@о}| &4Ҕ9-ɒ,^=ߕ $<>;DHw9?% ( aoOmϗ)*J`ʹdKoSo芈;Hm0**Bv_81xFWor n,B| c$t%qcHp;#sjfg{,Hyn__ L[UǹiPBTGD|@¦׌Y$Ff1:"T,3 :N]LPD35F95A{9=-J[n=;p?iqRځ$ԟh>fEFc;.'<.xO9@߼A3;g;V HӐbB׾FM6.a $F~HPFqkO$>]Ws"SHC{KKQ sБ3U=bfz Hu\ZE(qOוz7$Vl.6|Hg<;{7;azHzV &xg0I $q_^NԺ%(yH@/QT7* }A@ 5 y*Mv߸ɸ-5 "i683Os/Ч) qURFP dꆷnS#B sx*_|9# utz}JUgK-QY "-?r$G@Җ3s-]3$Hu\OHC\'x =P;RBGO«C #NLFݩ)}aH?Nd04X))->}T`|# w.id?~݀?d$~BMo.ܼg,Xewl؞}O] /Opbӕ)!AH_593.L * L mCFuG>.H iCf7A~; $HO̰pi7=~ŧtjבvI\&95%D I:D v$퀤cRTn;ǪޟkG]z}d7H$FT<"gZ]j\*; Hԏ6~e~={fRxEJ[: 4*T6q J!pDN-a!:lF7yd0y)ຯmtGPIU%rem{vFb֮_aj aD2Vl} bGrMG0s2a&h 4AsP!=[Nޚ[Jeuez=RHwݛOjfAv,̮ͻWjyar¦[ُE`AP{OY~Ø| ,\T~'2'.?$5 HFsHİa!(k0:]HL3,/a᎞5ycf $0.KI$!/h6ׂU @>".VPx}rUY_3T.r&#qByd )^+H.ɬr\D"8+~ 0fft5bG? SfgD.: o#,l,l {~<944"rH̯D=;RNQi #6GIMx"dDT'E"*3ʎ搠 W HDp?e wn͘.!  oz']F&7D.>нXk!v' +CYI+֯`geg@Fr1ȪZnhH>  [V 'L6\[&#a`]p)UW]-jz#|ʓ3 OOVC_>jޅ3["1%`M#E;帄Jtb?Əv$!s׺% )'I$ !K;W$@L/E6LZj͵Z xyAmGu eHZY&z$CyvKU#KS;ew;mTVbLNex/ `%?#jYV26V_결V(Tk@I'=C FeEkQCzip,q{ĩ{DF0I%B)o9o-7Ϛ@deH8OFFqzI"@Q%D"UPL,ŷ+~.o1WWRKjmj29+V3w(_Zzޤ .h*Hz\~Phw-G()UwBuWy] ޺& AQY 35Ny?]vG+ qڵk/*H-+*gSHnT-E<Iդ}tǤWY$oA!%+\M CK$MoL%u|rM'sB]+}b9Zx&.{RW^rhYZj2IQJ ~l7gE5aqħPDjIo0tofC[?\Xѿ`+폂. Zg3w h%Qg8l=lkvlr<_&*mSL{9ʋضyL gj:gL%OG59'#jڏX4 ^.〸5ko NHާ:3G " 1ۈSˊ髋J(]xEa2Ri|3=o޴sb=rdbi ~ &ɪd!0of\Π-Z\@~o%AFt.eh.B輷]C u௹s˪9-'g<2TBz<{YHf˻OHE$ ӏ7Ky*|G2-_ JxK&;m@@}I?p~OO؟ H~IBA[U,DA`=∟ #g @b$p }ѫN >U: 2#H2[nٲj?.Ƿ h"zO J lS7l һڰ><ك_-GT_OH#gsW<)A||,*j¥9TDw ޺u\Oj(]_(A#QW4F+e:R "%d'_ŝ~xЏUBON@ZO@*'μsLZ H-'IM0x$ ̤ͧnUtEQ9DJ-8k흹V@BSMTZƀC6ZƦڤ4jj2d툨 FE*?@uHQ&Фooo.4mg/xv{[NH+ɾGt\!Q{hDMec Q;L!;HaNj ׵[v$@'şN54ǐ]c(MB}ek}W Ŷ@߸ <[ODI9ç8Gg83f,05$E-7WL,*PgiWia9$&8[>U`PQ~a<\ X8Sk% q ~Zd{:Aze3{g\wb>N-˚#<{Ɉ48D'Ws{&W5ʅxƑ|yCU#rBL $̘g$$(\D>~ȃdDwO?N$ڟm7m*(f69$H#H];MyWQhD"9) um#lDǕht^Hy@1)VBJD HG#rHG}/ Ƥ0HL>KReF/n}׾5j{|m145dPNɊ/%"pFeY' :jU;ȈK/r-8}tF1~[dBJAbt2GaɵF֙12`;G G@16DdPKTsJ-/AIF$m}NB*^09 &agR7+ I4TM5*n>dl(G [/mĩk$ӝ2V.H( TҀ> ֡iW>wIgMHZô~&:䐨t^kIn]B69\_$l&bG:HuSA$uCHh7)rjHtn׆шIb(Rlj=%T*p? |bDɌ{tȨ56{-6Cġ?K@i؆0(" >'&];몪b^t5辆$kVJ0HI>! `8)tzP/CxTS(O|11x{APDV{ЭjV ^\@k6>aT <&o o 䳝^(.a ;22Vek W˨?a0<^! -H"s} U* st&,=2 `RJ;j:w|DH$πKLg@0)r\!Q{TTLDω HrAG.ґt8tΰS.IKVƙ|R\5th$ ĴHEomIIYW6Pi)*C2:cH5v@Rf֗'RuHu& |HXSi\C/2( g_ji6>:448@4_4Q z jJ#.I J@B sHz*_K8Ů\x%2~>ܦ0Wm,5Hn݉$aJ Q$^mƉ>)um_Gs)" MG8e] ;8$h<'+|67p-i<\7v75D_Z;~$h] )hǠ+Y^O HIӯ)RipGǵwHp@)?{ Q;ˀd H' 2 H+<=a 9Sq^4GG,no}F/wS14J|o$;"X9^JS".^ifm " @k;S/`byCt$?KD7pHE׮wewi\IsLqd A>vDvƾ:ʶA(pȊ=-|633U g7!6H9$8p{mW4U"8uT0#z/X4]ب|.qH^tQ "dj$e߅7/VHۏC|l/8?!s^2E*H?Ryg?e*&RSp%D@J ' ~ Ied8"M`{ͮ-ߣ)N[F x$;)d$qk;vT2HN*3HvZy&"+Eh.::'=j:8$cǞ*NKD3'Ij]@eH2jxyj$[ т@b7}qH<[`RĄ8͛a~v"f$ _DR4мoy]ЗKH $HTuDXG:82T4m8yQ`,aRv 4nwHE[3O_"z~_|CFzHIG&"(9$b jBlZ4I \^ Uڂ݀TeA'm RPMv!!3~@5]սarL2|I}*d1uH~̦Ђ@**K#yoGw!Q/X~BB9 ]]m]"@]/[ XHz;8`@ԃ܋rPf2natHb?_Hԃ <*q]߱'c z\~} у}zd [N{A[j ^!G3i2ArH ! a#rH ƐeG""s3sr| ӃDH^?"Z${V^Mdg/)>~ @2i BU?u>{"9lͯ{?G:A#z=D82t& È-&5Rqz\EB}OH/H@zot"Ѕw)%+AHZO')|}Q4ӟO#pȤIIunH>AIeqM@RFNTD^GPKswpHh'znwn_ˉ/pKsHORNގ&f3ځTb lѨyY lvvh!{%A&RIurHt}a Xf,3Hh]?I]}µ gX:5}X:VX 9rzBCI H.އeׇ46OdAԏD#d7NwZZ3I;3[e,9H̘sՐ@'Y~:D۹,@K%ϫ L*zS^Áz񧲻PfP!I$&RN*-l, 9 ( )qFICiGHߴɊ$i3gvn΂MM8n"5\aɝWu|+"5 #91Do! H>SccQMcx0H(.9I<䈝(f7=( #ep a;484 !}8[FB[.[]7!i4&.[ Nii) <壔GM9*"]@ #i:Ex }`,#IEq]SlSoyP.ޏ$d!]5> Ꭺ/|YRC~$E}`2c롸U)d$ )aR)WLsT0`}H@B0}IpݿSQa.+C']? MkK@B;,@R2)(oq(@ZL!!Ql"M,RMvhk;wp]Gz;r_1HN$; ,ǮR*⭥v$ A9?Gas ͣFxa|DHB{.0HHhϞ"!jiuA% q} H2ThrrH*nCr8xHӾ!. ?GqHiU{'ؙ)"volS{HoU׸Ez]Mpo-V5 #uַe GGDG!;QY{LG2&~Jq$1HzҭF ұtKD2,2E2KLXF <& ҈,A7EgD)9;@ R6ʵYx3XB;6ieJ6O& 2 Eb rBĄa7nn&ɞH-bwoPCvXh@Hwfz^@+.\Ei \!Iѷnrto `r|QDn!a@]7ëO=U!; )id qC~ >ĸXZS0Y0DqGSHsiƨC Hg/tFd{Y(F0HQQ5X(D|VG2>k N%MH^+IJHN@ғ|zo]֖(g <6rHUʧ+. `hB4)h&'գ*ƚ/ Y$ ).7.n$md']BΒC:k\IvpH[[ooo) k}-ŁG^Jq$ =,08p zk!(@QΈD' 9\t ˏo< H!:$Ca: TBR!R6įy3g. ‹I BJJz*ÇIQ$gBGG7wwvDGWI!x7ٯ?')'THTyû@Z ˹K@aǰWZRӈdMfcTߠm }1s$`hD$"#zzF๡g|eoЃNV 2sYv G|lBY$e"h%4yba(!aD=VOH`hZ]B@'萔9ٯ.٦G]` HVIpMх6~`rH_ā'\HD5\€ȴt<\g 'mq;] R=w>s3zH͝uLwV~66l FzlNf+t3ݑ2D*;{Hz TAzNȎ4l-cȎd!숐HLم1-HqCRW I  %]1O~˻Ô*RtOfΝ;kkj 㹮kNLL-L% }DKV܈]ʉ]Ǔ -A}xW{:$)~1ԑq_?8~et8IewsM Hg'P,kԟj!;;t(Svg:t;%RšA,%o@,bG@.fH|;&IsR}iH>T#)d(A @$sHKo7s 0D/)nT~"| @Y ҋP.RR pv=(D}H'5 gA` -7W櫾D<{<ޣ{^+cgioN!}6}dߛHN$&iP+c-?0y&-,ҝ۷sZ{!ABݷ$zL@j3Ba NTEהDUEGQP 1ioV7ڤ}+Ȳ5_NGk0MA'x75 c;˷ =JS @j48$-bG@ ޲> Ȑ8ɣJŤ*%@Q:9|E]4:|ؕH+mD\ ""\8A406C;ɓjD)ŀ#G=2 y"GWWMRq<iH_b &wٽ(ڽH9ywcA10L:}$,uLV(lT|$r{qHI׮`hG`t/Ha %d*T!9$)!'H75߲%K ]ptPHh 'jSM{c<IEt >N=l_(zJʹm*BU } U<r@оqhG)LYe Rq jGA" ]A9H*iʢc?r"Ml8)癌, xNIc8$|Z:>M$;$:sou;:5OSߟ7 yß:/:osH!{]sйAC t1}2uBRFU[],I@Qts b#{ڝ(Y;z#J!Dg~{K ߭XdRc`'Jٹxݚ.8^FԩeNbxP2_blm?HaH/}Mil<*}[$AzU$5o{5&5b@B8c8$i YAfN}k Ԑwe)r>rgJUX|k[݌$X'=.bJQS[LTLa!2[Ta9'W Ф6fn[n-GuQ%U D'W`\Uhr yur|38]HJRNE(V'Y%aSvyZ"l HמoEjCe]ځG1$5DFNzrey#U;1^7)Ʌjɯ:B}U?nJ }rU.O7t'[.T:+p{Z;A`` eG4;-;H@SS۷KJn߾`n=@A? !;UAU(71U\uCRin*0o<*S9'R3  U@P'w >|:9e9PXM=-BIĸT0|rUi:.? DpuuatNZ~"M %bMT)P:Z =`OsHt}Hᕟ@{>R  X O$%EWN$E'%*)>F"S PrHHw*Kkky?ґGYv3J|Z[XX.R /S"d -qh@j'6fQ=uΠSXqh"l5>NBV"UHHoHY+΀@? #/ψ1H$Y{jgN@R4핓)ީ %T~"&xԏx$)TD'(z 2:$wSƨ}MЇf\!%DD\g [ Pg<)J$i@jU&7Faܹi$sN'$o3x0KܽA& @{;pG*Zy7:EluMYY9ˋ\oH/?}؟r>cz;/$ωB$$yP[` yVŞ̒ }}wg P΁3TOr=Gz|jWPMmRI G\r(7/DH !Q+6B@*{*ZC~ $d}s{*]xv^Tkf,.:K}H2/a>ANcΈיJtG4i믋ۖ0oEvl=]j>A;qV;DHiZc!)pTDUDȎDwz A4u DJb\RdTbf+!0'M9ݹs[;wHdr0s)T.^DɾEYrtyGl`a#23νrGGc"d:0yuF sXC=G"f7O-Z HHHHYWrw5 =P-s6N$> +y(a.J]qR8{K/YxQtGr.+C$ N$.qRm;^:7;j>xHhց4Tj˩<!Q{,;["-DscuG}*T;lǁ,諮$PϬTn#v z(//]Huf'5 D1#=^v#i,>")5JA" Z!t[x$i.36| %_oj5u7Vȿe"r8J ٍx`.xSfҖ-==9,҃̍)i^Z*dE@R ރDbG}tH:)Y1eف@~F@D*{?KX}yd2їFMD1m^S)n8ѫeO4E"(H$EvN<"L:'vN )vB99$(g+,`iHS`DH]>/a}͗.\z9a ̘ *IFYot1)$cq HgЀ)#,k rRyf"dip q?H^i}o/!K>:h9Npwt44K+-WrHN핉/XG@Ak5ۅ $XHKl *E#VrH@uXRC8XODRR;#d1w &ډ4<54!ig&-ⶨDىBʳY HGF7'qFbߩ^<ԄGwDƜ e!M` 1CxX^CRԘ$LG@IMlS90ݶm~>khBD^B%S"X`)RDqcq2d } #cnvC"'Ҝia$ 4Nefj'*"aI'BADN$5/*z琇!D }tJ&yPdV=X?(ƭP"!;gE>$"Rpeᰤ>:$"3%X%z2X8|bxtrcERR`[{f}Y5qtyGd"@$m#;4mGIvH#"w\" $q}ooNPD# ; #H 䏤s$R!xdٟ$jD$Y]V(@bH?iyD#$` `={lDӫr)%=:5^w ?AiӼ?Dx)9"$mXǣ77nPH8A>BOWw5~LdooRCo23鉚9lxGl@$!A)_0wJSC, ed-L&3'1*2Y.tĄgd; %#cNEEf9%zs?=%v@B{f626atY <9/HDC ^"Hvv<2l ",c9Hd " wHdeP"*rm>[ZȌ/| ӏ cĠ5_^㿰 sN#Pz40qޞAtf'L7G~99=Z`.^AT6q͚\,=JY)nʯxi,ytE-0h%OALdf]E9Ktdž M7wtS\=͸rcoxYUH:,{!&Q^o_׿VCY҃so-#'n7oڜǷiđ}DE7|OI$.oES~irvb? q YGo#m^VW>4|DO&%;y8^%DjђMnC ˼MܞB <I1i}gOF>};ԛՋ,`i>>+WFF cHL؛(#Ͼ:jpm أ%࣬xLR; dE(A@hi߲BbQ+kO`Ay,]9&؝#_:ycYUIb80ב+b5P4vJc H\/9$~y|Yoܫńt\>Łʴ?mg`,H0;8/`uWttt"Y`CS%HQ1 Rn.p *+B45uKHY7ofIPʔ)b{Roݛmܨ><۩_c D,# L0^egNacCrsxPIH2I6d\ :{ DK%ENmO% g 1 陼#dӊN8w\(34]g-+MFV:G@(Ӑ"E(t\u n!="$n[g}~ښg@Kn~)3_IV *= x HΤ=/GgARPMH&u|ϾY)Y11!QAi~'#I&TWTdq>W|)$* `OysM%¢u*%#c 2Q^/ ?fRXtYH_u@w.+qzٽeW zbHF"u G{rn9\3#ȟ+ H" IvL)>qD߭ظ~ځEgJH[\!yKD6O$W5sHD$ڟ쐨b C. pobt\rHw? 7D{ed_7~qUg"#$%ipp O]V{{gVĴ&?͡oqLĚ٘hdd{* (,lJV 5%,L%R/ 9{t.[ 18[/|.}9cUԕ6a%%c?HàD<&;|2w=H2@*;_ R mF4=Ǜ?eJ1gRQhH0HB6ҦMݜs7h`rBv_ӊWI팚 Zzs9'2I(ϑ۹1"ݩ]ɲ=%=5$hvptDXQ`HydH`w!lCa/!*8DGP(4_ϡ%mJK~: )b1L@D8`<@Cܔ;8TʓJiµpWfD1ᓁD-%9D_$폀k? Oe >$|N;q!&pY/##KC vڥi t,Z]G dD H#K47ẹ̑ s=s)!)QxdAOFC[>$%F$A)l'K ҋ >'fGH]ńV1f=P0kHp -0 M @lKR^̘3+(bNj!"&9quDM }-,?̃&q4EoXE~~XQˏ$$Od+M> D<@u%!$n51OT2 XmA4ŵh*l $h<쐠h4ͩr|N?Kwu+ߦ;.9$ٟR~FeҌ2c87:>A@̀HPJ$!}BL k| ayv#ᐸσH欚'[+:h=KmQ<3'Ja,Zg>$HALG>V H{WH"&R:@D ȿ Rzg_ !` k:"Hh>ߧhszXP!0(*K0|WBR@"QʷffLDDʀYv 5GT4o.uhQ 4B, K" HP4Q[7$:39@$;$iLҴ }4(MN.~Ν0_Y{&Ilwޏ.rH&RKuv,73RH1/F9=b;zԇ$,j*/~j n%9&oSYWG~4sj GI!%#BaayԮޟ:ޫp퟇^#<*mrHs 8=HaBԅ1o_vA;ȯ$&H9'W5$o毒EZb]=XDS S..BlT'v@pn$IVC-Yb}HƜq H;9 c3_ymdeZ4DvY7 mvr!wJ=jeM`8zg8h0lvoo6c4HV΁Kl85p&9$ÊUoa3"!0[i.}q7)hh,>3\vH$ij֎v+Wg҈G̉ěE^}kaý^$-8Y_+kƗu#iLkZ찝_D @› @# 㺌Ź}t@r&0%|XT~DQ+*Aչ;B F|"$ĵ"GiZ£c. E =yᑚꢼ,GN  N "UvU,ޗS39ָ\εk9V5HMξŞϙ9$zЅ{$4XCA =߹y D51֗&qptDnyXccc7<:p&>RιxOrrTpRh)A 0t`6ԃd݋D@D=HzCG,9AHAzDn}#JJ>#!n+8"Q%o+:"=WҷC1C0&o}Uܜ5UIh*_=|xu&Zit+>tc;O!\DB/RDS^eOEYJ(~(.NM5q<:(ٳ X]IQXa%{}!J\g.C2m7}336euσu4ۉH؎>K"! !=W i;R\8dIg4#rvÌ>,fnrιiɠ H_2m\ənkE)v$ڥ;i'O &%d< =4O !*T"9RPB0Ơu^}H9:IZ؛ҀeّCt$u1 ;8eƲh#vzzS<Ѕ.ȷru Ӏ]H^P 0Hש18Hf@VROp\ 񅊰6m/ ׯoRS3rDP*WDD"'sT"T"̐Ğ_>諤 F,=<7:ܹBM-,=%mmm%\iV~p8Я"4' ͜$&9R&UEyObeٱ'XWP\$HMlHovj׮\ "g @Mmճ5 {]Sz_w֒+wf3bErzZ(g-tlRvO嗠bi> 5ŋ]/^7: 5J2dn]d"Ov[YͲ+ ~€B4),W/09$x]ģ>4b̑HRɐ#Y90ZN?5xZ~I'h'|T&qyn#Z&a0 _g㑫Y#Mvd ٧{;K0|-my%e\dۤ.)Xܙ)XN@pH $%-̽͞dI/`tư]HKgk0H|*@SWP */GģS֍@JVpfH p;H]HdxUyu蚗#4 _\?ki Ul͇ZWU *iov047h)U$/T!U.-3gz {c9"nč+m8qDZِ^V֞;=%6vK@][X]~C: N. ?kΏ] oilZ'jbϦdm(ko\s$l @|kɅAIB@RJGSEzTjb:wsriG;mTXZZ ΟmzRYb@nP ru;/jz_)(etdصDvH8~~+EMG)v}  UfuU_`Pk_[S4ϔ&w}$ =䧼/$A}Q1 ,瀶X!F&*RN6=rȲ)*U-)y21禛=eRװSM7o~ T8V3\npȎtR!ҩ  e Gf@!H$\^WKaf&T7 <%ϣ3?]":uRfB'SƗL]*l r "SB8[!Bv:^]ŷnܸțV#YiKC"خ+xTjqM77Ojȕq9߭{Z-RRH׋^HeRC.ߟ ZI [ y Ш;n7dQȮ@bfɯC 4gu$rH'rţ$!I `F'5p !ծy7pod& @k֤!Tr[Q dH߭+9 1(oJUHWMa+K.=a(Z BiI>`gB$U Ҽ(t'˖@R<c+ Ck+aLC_Z^*-*uU_CZmHٓy6)ad7 י"\ HwI O'7@ JǗn8_2%X$\E?yiD J(5jff,ҫ&5[>8fSc[/<:Pӂ]v5]&I@ 8훶sݸӾb'fi7o4hw} oDwr?Xw~O+]R:H1wGmvҾumq?RVv?Hf`LHF*Ij*Ӧ}2MYTXoMJv,`me5#S3n6 1e7EB&-_ 9ӶoguQVwwkMd6@G`?{ǡ4hSH9CK Axe!Y:b0IGw\~ 4o '4:@L!y(4cTYzl THϽ\)?T$ǵ30Vg.gCp30K;00.0bvTZDfc-R.T\Ki,wHA'ثýٱPvX#ҥE3- Fz > @bHBKZDPdk>V!vd#CKg>9fz/?b@Iv6$%-U˺ޛ_=Z=XxHCW8؍G.,U$vNOAXD{i/y:\,u1-,Ύ5~"i?⑖nI-_O 2ոIhP6ƣ,$fk?R5lL?/Cqoߟ9pн7YEimW͹XJ5==NICtTњs?,CRM+"'ٜ~@ D$񬝂GGhQ woGB-FI "Cb)F "b n=R yӾ);"(S٘~3ox{<]/<陠G74&sbv&i㿚24ĚND FuDM}/m0'$OP$})yL~OPy}I>cӂPua8FOSkG@j; "eeu(\."O\-Z֣>$pR=al7gwHiH  BƄ'>!!A?!v&{&N5 <2O$#Ѐ]."H/?"&zF U =Cj}$d}s{*]}a秠 R&EbC[!$AK MWcx!Z_XHSk?2Q3y?GȘ0V.M@QE<*ϷC)%()̭Cv4F%0fv/X!rHjڷǂޟuEuyJK8hRtE<mt>{i:: ba@J`hw'^-:@$#HV[vHiЯKk P6l);R[7okfhWGG=b^T+[ P_Ϡ $ BC{gSRvz@ZSӇ5._oĚư. QN-!=~ 8$B%K2: ZOͶL2P]<GJD;;q*&{xHd,42H4 'A#} ?Ϲ8X|KĜh =ZZ,$J@[HKQcҤ~o!ResI,Wʪ,H XU(WM|c(~#tu~s( 6 lW:ʥ+?IcfCI?!=⥟IQo?>BQN J@ E P"T- ͤK#3i& IMl86}q(qw~#"&~귶$"էAZ 3<Z5PZ<&`«QbCъ.}AԇWʯ YnE~w^,=[ãt8#(S\!Lv;ɒG$%|yNh;|S>As{hAH- 5}G`~y[#= oH +8$&tHϲo}d)S@P<|+u DWȅOF-x8GHx$<CGO`HC (JWQq5.?64ýXӀ #*%Yi6)g<$jCO, 1G!BM<.}bۢxj3h%REQa4Q{9sW4jܬXQ:4aaB??E2I8bݳ[@Bl@l}HO$g;<&Q:#*Ҁ$L0܇uyKxy!;<_9ݮAHNޟ\ʴ/ &!Ecvw! YLJ 21(y )bǖH ##}$=i~ Jg@"/Wz r?>GR(}dJV}x?HPђMxJ;UGs}B^&)~w&S<\“{%{HH%EW<)N$Iak+4G Cc(HagH!btj "Fkb"jwѢQ1F$Jɏ!Kڶ49"53saq `˿tDF>a-F[I;6p=`BR37oތqP0DvBu ̏ qX[c<e؟b<JGeFw$e܄ fr&o߾=ئDE4?l/vfW=[VDz|6r;gjƶ4aѽ(AKӼ>9~c*>^x0˩kuh%u("/rۑ* MʂRHPTĂ"=M*QjlMۣŏ#9mSsh(R+VXXnJl`R41@ZiDڜߛ7{ghO1;wԥ}zh1}NIDʈ 脤ę8̼;3Ci5$[ ~l+Rҥa/HԥLYЇC˧'+jVPz֑9Wy8PR H6Hu e H n/NJ܎rWi ER۫lwʿJMPBdnS_~ɠ ŵܹKi.Ucߟ|}.[WO8tݹ CPhBr\{8oCWOzE11ξŹlܼy)" @(hWQztʦ.C I듓B,mzuQr@ʁ4rqdrɫ^,ZJxK.]ވ5$EE"r5!i2I&''PO3iF^ru|-CS۞47::"II!|ol 1N\-ky <\&!Iյ}" uERLzyЀM;>o%S5THϣy1}v@A0O+j^(?D9JJY]c7c4N۷33E 0ϴ3W[kVOK #!գ ߳bJJHjaTUh]qWbBtqOC _j-VoFsȃG4"eQu]my4mޘ, t˷rUЂde<@N{j5U| VLb`ſew:ax0ÂW*EX\Ѷva vx}4L!A7IDg:O0ߙb}ҸnBۇs&y8BBG=9^N0A5ݒ; FZ#kBhQwī5jiR`435ͫ]r) %+7OjUYN'II~[Ek&Eϙ3+WN [WB[A3F():\z^3?SXV]T(zRRBHլ $I҆'RD"s, [rQmkO0"=$%E|[<ZطG&?Fw߄,a!I} Aw& ,d m Hb᤼ #MaDjj"62 ȉLWYՂ\Y߷^ Xz Eg!ۅǯJ T.^ I=v`M S؁6Ro^*:R̎,*U`rlx,jVҦ:$=Ǒh"I0IM ̤9sخB2ч|GR<[W(J i]dz+{ kkcƆkZA|X|4$ $`"C +A[U:vc&Y9>\'d %8ZKR2uɴֽ+m/ZhFOg"ή>%/?2H4qT|r+4BAGM@Zq +Neɻ{Hh6q^J N<-}ڵlL_),&4p(?/ଳҗ& %?X H1Bd$F+'D[7UU~: w֙'WSy%i&‹'Qa:m\!HDZ BDy$(u)rX͌H{ ]R~)q*IВ%KtFEHD<""p5}(0pDFHؔ5MI ?LZj*Q#$IvGUE\#iI+4KȰTIHm5{t%+Ru4@)$ =lo!P-JOihj7xiQP^uTa邁#A"iHv\~:;@J*H X2Y$-%+3lMt D ]Oue Χ%Ӭ%F6|zɧFr|}#")菈$ȎHT.]ZZ]k:ٕ.DIӂ $Df7NISISH[Z#QhT1XUѹ 0䵴`#$TW$-Y)0_UҙĉdvE>ae7͝#>̙K&@Hrl$ D$#{6):݅x{ ] PT?ܕXi)gSC [N}DDDIY9lpKK@퓁 =b;s=c@8پ}4҈ αm% Yp^7M!@@b *VTT.2(55U HQ54jb_$ VeFڿc\v|O$ -U+~ 0Ź?h4v~۶zZA5'D<wvz\vhՙۄuR|ѢG~/Q9ϤŁk<{-'pz񾍜=g}Jf]ڭP'Qo:{xKmqW@RfpeUqeq>0yy36c4|S7 )v6~C%nl!/x \vgIry3,MO/bPT'Ԕ.Aۂhf A>nTRy]s8Au`-ߪiiHU/SoZT ;d!A|)J\EZyԸj?Mm oBDssmT[K<$潫[&ɚG;ju\­F' CR//HrܟiNCSTi¸[y2T @}bFCŌn;t]e/c ƠjE~t9׮Y_߲`@Z)O{zT>HTYɸd*|7u$^aшФ:=]w>5bJu&H$#ak7GRiad|eԫ/[Xu6k%ga0;6\G$GfD>;Tq9!U%) $YFZH Рi {ăG.SH!/j ov'*5 "|<&$&RC*^GWq YM-abZ%u#je? (\|f[e i: ]I=vH~رxN ;v\;vw$la $":H 54{{x;W,?4Os9:mkmᎺ8ăT=ZR q@1BxD.+"Y(re(ocNB $ %>=z);=!$4 &uGٗN L!a.?^瞙KE㑀Dm´(Ꮖymx@7߈ɇFޥkF#I^GIe7@ 80p4|fL]kk jpڍʒr]ppבn}?Y*,$MoΉ#/^|q9}*L$RŀRgXz F11|e߾ӀYgh R}vL$n$ mf(>ҽ3=^SHq^HJ<*TNKM dm`\ >Zxf$dI@Z$l!P EL w]x/~Q._1}% IfW:@|ov_Rc` R$,Ry.tx7S\ۨP, z ym47{-;=NovVˀG<]Fʺ:(}IeYI0HKV :d!e!1Wmo AtWb<"M%~-*H$'L$?c켥=F KgI8 "A#k! m4d_mا}ɳH@}?4w|褯~>_ݻwyk,RTe9}30X_EA"o;A=L}|vHoQ/Ll}" _|Lů1G֑,YH]oՃ=ԅ;,~h;6^luHDzGN]z)G{C"D-% !C< mAo'$%%E+RJ0@(:d1E3HfV\l0qvh'E2w)55.9 @Bx& oG~S=],XoFF "RV!SH5H- գ)n SHj8]ޛfb^زyv(;x̛.T [ө?ҵkR{&)TCa ceOs\b VR}f`]n<ť&wݍ$|T:tF No5vf \IGײH &HRd> djZC  }HKCRx3Hs[ߪg!9RR"AB﯄}*@z ihlHn`n]jʬ4E⼛f * Bbw RJ;ԅQ~oivs  c)RT 'Hk騺 [ $Znt56>o$(F %GZ$ÊiJ Hl/;<@2ICJX]7<͂DE"*tHR|2 }2TbVDZS\d!-<inZN@$p )8}ķZ@ڽ@A$x밷mT{;/x3K@U"r GhE-'X0-$s:Q hQp@'N$M!D:]ZS&sDz{7_~fyH՛ -  -g%T <iKaNJkYL(@P;Q G;\mG~b@t&:hEvPWVJ>;^m HZ2Ǿ7鸈ģ?K'V\q0qcVQ+12k{MuoBej@H4)T ]5 8@ZD8PoRlCRþ}$ȟFmFTSPۊ[цC$zSg#hsVR224D'άyz5 L.#,eEÑ9,,PtnM&9t$6_RDotkNZh@S(D@KGjmen{ ޱp܁=\I!HL<]pwN)#< A ؼEA %g@$GL_Բ3Pֆ7sg?> !y !8haIǵqt%G vP+)ia(@ZH7(s!Uhp@)Ӌw$~/< K)/4&~ :$o$@\\{P+e wMI@H# @Zh}}~†]W޺+o%$uBbIژ0ES: i"tUrm@u I-jX?ӳ`A0?@Jƴ Hk+hH-멡jP sДcJ-#i*,$E؏o&R11phãw`76pWӼRF$oO5+ t& cGH2u9u99r'H@Ze$HgI҄o@RHh )J4+eqٝ Jģ;FJF4^f!Ӏ_&Bwp|7┰Aw$kݡ[H v*Պ(-~:dRH& ]<"FD1 c]?xA|L ><%F\A0DR4 !.\R5`w^\FbDTkoAt^ئy$8D }H9/]b9.)?UصR)*UuO` CK n.᳻XBd"e]nsHoR|v1$^i֭#:]3c-JTvLT Q|wHH=RS5 jM: }1@PC5h! 1Ha'؎քC沋Xgh=;yܹ;*wYuH2=HyHmF@bagSIV HdH\v9Οom<RN@ =6js Hύ f!UP 3HA ]vƠ{)?w@Ҁ$8!%424' rw4kuA4EPiiK>OPIȸ/5ɏ$qRf |v?esu# 9+YJ9Yo֌G] Đb t,7)F y^-pIWogwGCQߘPHem$*"U〫m 6j)쬮+˪; D@z &AGH11%we_kG]1P];DK6kd=;w;pN{z ۹sM /@"'$$Id(1GBKEzjZ/ K䠆LmODOp>T6l!D;1;U5ޔв@Jҹށ#P/ @^aAH@ @J3(M`I摄#'aģޗ*zWG|i &39A (({9h"eOY!9da,E,COq v5%@ O 숷M>Xqgۜ'7bzvsýs'Ůb|uKpzH9WJyY,u܍#MS c-*0D;ٱvIJhN; A%s[P%7C@"Dx53 R:ʣx<44qda,}7V{T6Qw:r H B9,VF~*Rv(A{-w1WH[j{}~ m \_ρ! Iɟr-/v# r${9_+s: ?ωC cMet):o0ӒNZb c3SutJD" 3~ ၲ7Qk8YrCbԗFUoPmw23RͿST?gXb27  0y>"g9W_Eϔ'.G1F *̙Py4#>ʤ* #iөpA$!=F{谫u6?S !c&Vozjj`*튦)(TRjx} "9Jĥ` y Nh@B!oC&)̎ҥZNy@ZKv̎H{و{bw !K/@z%,2{H0}Ԉ x.;!@II 9A\XfۿTN6uHKc3OK))uǎR<(u yZr wvGcrUj䪤f%I쑧]u\U$yhdwg#$+Z?rGr?쵠*ӒEu {s?8ڥCyu4ydՙ Lq}&ҟiJ"G4yD } r[#dʗ= i'}#H,>H7ِ:%curY*ʬZTPG Pע1 m,!y:Q, QhpI@*a<"dg;ϝg'cry,8rsv>HN,x)V#.䙹w$X,0z5Rh}+uKz!y<%yɣ# k $cпc=d볃?&tJH4\G}@U5]vx7)>:n"u4=wz JƵ Ю(ԃ * G'084 m5IKwRKR~yR,B/~G]~䷐B<" a$eR" 5'':sLF%k5INʊ!ypaB`0 } 1QAQ$Q̥f V+܁ Qa`˛ TLw{|RR?&&OsfGX-0J& < %a  Ϙ,/>_]JUQDSgϕe.'Iiy0A${ yzwe;@2 qϵQ jj'DHC[\vNB>q,f5i~4 IHuY2XJ_Hj9%lj0|7dy)rHSTU}UN.?w\⒪Zox `.n^N L(oPȶ{O糖mGXs$`@z"`/G?T"Z|(os_pfcY7,f84R(NU{ пt`ڔA2sa;ฃ]N8=>vQ!BZ <.$?!vo>ozWҢ#/:&?W$0-x b;GpdE Rl$w+6of%$ 1 ;Tn"yAY_ bG@qmSǓolCtHsGql;gcXб#4`@ZX.+ uHc e,*پ[ɖG* =VQB@QȂ2)'x4H3/?iG@b69$.skZ-qz.ѣ|'fPͤ)҇>!g#?!_ǘ;khJKKC98>JX 8>ģ*$}6<ҝ7mfi-D ֟|H%y@ L{=_$2Lş04fML7oC#*H:mu9; 6ӼyEguZV!e(Co %tҗlx4Iv ft믶B2]tO>{>~o%Qi}>Ȭ/d YNqm"QD#H(h)e9CD" G+V@JLJE7$Mpٽ)o"Ǘ%:B a|1ǥfC$ H4yv) $hw2[@[U_%5`i<E<'W#+"շvH$"LjC T R2dUHox_q#eƖװ܍،6H_~164@C$D2(,:H~#c` %@ I$rH:"U"#" H :mqqmNnGa52&++"e-DzRu%?bJqFKrڱroia-yK;uH{C׉QO(yF_7iͯhMe6O0 %V1VFJ)a@y$G˚_&xDDj_]dd#ɳmt൳҇\d A rIye ɯ2 LEYB'w"pU DH HBSZL141*JcC=LPglRG i_Z)Q3{M}\n;{orHo@Z"&lF~8-:B Q[6z*Oڟs[=IR73,TݯF$2|VKtlٮ[qϠ JJ_Kgy-eYZɲ孥-4ذXq&a;zMx9nϳ< $O#?%IIh'RH[ &ҒMvU7]TU-n_g9WOϣpʓ?UU;~(9ᡁƦKZʔC yy /{ 3(/;`(s- Іa0Z^MazmyJ[ڼlMK̥8jj #uDrS)#5Y @ϊ#5=P,~e|c /; *uU44ɪ.zʕdT%]xI8wrهWt#+I%A#J0 !N%E{z* iA-˖ʶ]+-E]!R,$AҴ$K~4N <ZBhm|S//ܣ?f)W^TpQ*m_ruq%r)R}].6~|rWp]v:ڨF2i--5xF)g@]H[;l Y:˛[cb!&qV?HƜUty[_R/Sq] [cq"Ko(Kڑٵ(zŒ)#D2xd'RURDZM۟! Zev:#@J^{ʫ \cEvuK<oWSY=.&i ^>|jzC'Ep=3=B(A mi &PzkrzzZ${@Ne[r4 99b"{p/##1[e4l(oP_Kјr}ơO5'0јcEo[LTk #"x49^#$0E_Ea0Տ0UXdH=ZUzdy:vx>*SOC>E# I,'Di@R72d.EJ7Vus"*.<{8ߨkY2#K^88# R+<8t"XرI>U8@ nؐ.j$董\5H֝>+0#Ƴ>yh,:J.I)=G٘N"qǽvIwmk "*v_4 _//`ku"5" ʧ@ZOW@:78H{B Oe?wf5䦔-V@\F"]T݆4KDD*D۲eh`,K|MFV D 8ڹgYcˉGPݎw$jt $:.- ٨<9A(qˎɹex(. + =IS/wu;jxs۾6/ʧO),Fz(C鴝x|YKT@bO{6RP%7^@(mbHnq0gSL7U{$vHh𲘊 b AQCӇ6IqҍH{@u$ r8Cv yFH !ˎx.XH"%#I RDz, s}+vmS$ 6"妬(b<1DjUHq4ÁT*13 HmYiQLDFZ.D8}/wo=|t:.GjS~~_HH=Ht郛.}id/[zgʁ6q=i][^80,HK#"Y4" TlKW.ΧMTD.W=fRYHK&bvipEAgޓ@"@"Bʏ@o|w߾mKlL=< Bz(v><08995w4LMYOň%In"%6hvR pxrRS%;4r$ɴBS x}3X#xv:pu~=:쮵`Q(î ㍾]^A8;>\7$uzgBzpxxwZڃDg0 }GJ͵7ww}I;t=n^wE e%qx%茘?}98znY+$XB_AG|pY\xIŋW@F6}WHD@DaBD}pk_zh rmŠdϙ䧐dޚ6i! B%0hE/g-}2a|lX:+C-@$J?n6GK|EDV)l3f=㏇?Y2@KlZ;{UuI$2]`N7WR{DHMZfy ?.jg,La!LTd ITk#] "ץ[߳#q(o s*dH-HR@t7 n~<@J$pU4wQ~ Qv=ެ3޳~a{Ѕ82LQRˤF[5`wMŏo=0`V#[/B=w[?x^H|sH̀?e'sY>r]' jz= $ՈV+ؖwS|E& %MB4D @pĈlw}5A%vk®ӧ5lTOX@'mtu>q c))QY 3O_'lٲ~0i&71SՌ ޽3?o;9amQ$3YHH,B^SU$H$"WH2k_]<"s8QuqR %_~4!~1d]b(-)LCg!.Tr88ݖj.z;NGV@@sg(M7(λ蜜VWU(~ 5L3~ÇLiapvtA_r)7F~w$FqyS5+e`6}Ga~jc Er 4x~\bRN& Q!14-Sk+a1J><tXD[{_eƟ׷?0.ldM8/4AQvd! $&'w~Q88[bvJlF񡥳4Aijw=ƕҬII/wY:hl(YHM 8n <<53݈@>** йK;R=FlE$}N8>],fW{=UU/u Pn#Iv kC0>iZE@D"i6p$te  (,jf1ul6^%k7nWqxZ{9Jۧx{Z]b8nH#AH Y?KcH*[:,$9<1 $KVne\81᪆oN+iݫޭQiFz/ጰH \ÇD_E\@+VH$A_@!EJqmb: DjfT$M{B5Fq!n/wfǏK @"*&lИFDD1D0@$1ȼHQV1 I.ƬVE34} o:q x1(Ánn†ÁĪ:;ԧz;U%YHx@*'$EuGHŌ>BRKud@+{S3'Q燎'TV)9Qxk;a-arNQ]#Sb'pWLϽD.;i"\CL€ԂAq5}S:50 @J@:ye]ZH# q$%ehqR6]z|T }>'?}ŀT0١~9=@;wtA$~#{-7\hHzp~[,"ӎg@Ƅ]dl\bz7gW--m[ai` NE4@bKAٳ)?2~]vr]Md "&AߨK<X(гLA?X'i& qeJ FюrH&L ]͓ ഫy8X25 hR16H[ 1 @""Q7:X9I9 `fzy& e[}tH7l#$NxW$*–Y$i]H<2s߶' fP a3lQcd$n(HR14#&I ik3G>$@@2ic$M]>HxTu|vx?b<4z {W $|2u H& e։C{/g(`?euY 4rH,]Y?wԉpt) : dH aͷ榒:ԙH畵1aʙɀs؋)ͷN%[qur[l ]3G4Vk;=U iYMٰDK5ѳU]N;N6~W҂`i^9!9 + 0 ؋ @q xT\v =H+kA r=ޓ5 r{ºO 32E87ZɏGBF$ˮwPL8eBbe'2-& d $hBq]q} @ʔa*=(m~i3G|v,i-EJI#x+}8`,K eyDCH/ů !ԂEi~ O4_ 2.]v"f)EF LFBsV΁tRyRO. O΃1y,%wON.;)0IV4O3Ik!|!@f[Q&E@JBDUu:ř;-ډ?M/;rߌLF0HJ @D ۷zP"18ߑ:GuE4 cP $5x3: cC3 $ؘwdB:8S5<#3k,H3s--ixM(#1Y\ʜ Ɔ6[~p鞆U^jNBtcK]evt-ekuq.(g嗍k¾#[EQo42:%ɇs/HH t ?H($rịUEI@McNH`!1LDښ/H$XoeA ~2J鱑?JEHFl'; ]t"HZě~À5ku$@:./FLɏfrOI:Bj5<6AXHx @Lh֮ Rj!}RtvRЇ}WrKI}3@I9>FZ:"=!qGDgu'-hq:x7"6CbF,r!Y"-yl9|a}+y9B9೛|7Mt_'&$q7o#;߱#i?rCJ( C!`p_H71%|(Luzb,)g;R{֫Y(k]=!eQ) \ Lo I8ɹI,S49 <-v *# DCM ; Ż9X@pXfQB*e%va".gRF4.N ydMtnүiN "bA%d#-?-5qHϠMoJ CꠏG|?G::cR%=y85$rەڨ b, Q1Rr`"HFjFΠ>>7!f M۸ege A@g,|c :Ix$PQ! 3$d3ى^1uX5-% 5 )j @IJ0fP\e=p\?aI ! @jˌ-b:DyD ;#Rᆳ I0J#Tc'=|.;=HDgO?fIգр#LmD(.U5^UW7/X8 UfDS4b4=G$$ba(<݈mtƄ#E6 H( }Ā񈒫l$\Awp,@r0 -]vWj-$KHDc_~/a=c-tf'5fbxV孲! MGESKJIv)4=-)`JZZK gg|4Ac>D'HV~"a.?V*m$uQs31JKbyD4]6I"!fgQE.O $@j 56+VJɧSR^-$ ucGT\I" fZW@2x$]yeu$ HOeA4QN4b HTH fg;( Hp =ޓE C]@:y$}v$.tTj2rTv1HMBbZ$tUΥIGsG|1l0HD)ѷ&Ar'f :#ӴD-?|>c!5gO{+Cjmq a1EBm2U,`Z*X(f)зuG=_Z1ސV+7H+ t8!+quGq;(eE)`0HJcTJ\ "bf my'%MlA,|# P.H$<@ϏnRAݡwژl uwWC*γM]R=z=(GFD 0TEU #Ƀ+XPv3Z<|<NBL-R첱30&HlvĒUIhXDrNP>jX># )(ƏQ ! %]Q"j&m;N Νj*.Hi$F%Cf -IKcU uK@ |#/З| srQvUK  'ji  W.a8A9)a~1.$'!{ǧM1@[H$%ix:xԲQ$JԇڒKK"!c2Ioq wQPB±sHr$ayqkY2"yܥl*@VO@:;(**.T-T끴XuNnZ妦t4*bhkD:{`6:)r&.O;g? a%'"wC@zL2 $ ږXD-Sfw`CMeg;cE%~wvBaw-EJ/8>$ ) l2._yDcHH˗">\6n sfaDJ9y -DB]Y}(K=n04Q=`ݢbtȺb&ERՋ5D6|6"y $ϗǓ%cX"sʲRtGxMuٱ\Mt&RD|Q6ڢ$5B `NCc耗XØI'Y;44ԋ-4ḱ{dF@㣵t^M$e5GAF|́D5a1B<.g>-BHpH] ؉*Hip IEڝn6I!s|S1,jHi.ͣƏ}F}^3 8djȺ[ߟO REb 0ÆIlڤٶ 4_ nѣn.fQ~] <Ҵ鬼F \gG}1CfiH$fyD$ yDr yD:.zqW$zkf| 9u4̨1JyX 2hiFuH.H$9ԁԨѧ`^ $Wt> dO&[ B }1Whdxa$,@<]E[ f>͇vLF&7g n;Ux]4 Gf !~hbݲ9xc5 _v 6E|{ʎy]6}Dv$˨-בG2G$T$=p`1f]DB QqeQ edM@G J H2Hׇ T:9.zHq k'DL${ yĉkxDZd$~^),zzaA׀gצXdlv{Gߘ#zvu 1%Oy擽8DeRpm$0TP $cդ8ķp(lXQ@^ A ~<={91_Hg(:x6 [06<6%Hחtӽ_`β ~m,+)|˜lRxP"; 5>Oz6S/h BYnCr5|U_cP zl#  Xq,oNwHA=a͒_H@}w<@'2ۑGaLDbHqI$IJ8 iVl}f~=zT=?7e;[j(b/80ϸ y@B"F$,߽f2EhiG oLǑh!dSV$$Fk=o. ɚm`bV\_ yDBHyrblr9H,'3ٔW}Ԣm6߮ڦ rϣh ^` mD 8!Ƃ\ygm<)[b6HvHBT%!Iz $(~+Häf!  fk 6;o۩u݋<HAXxCYviD0(|W4jɒ\8SP F=t('͡3Hp Җ(7Mw[pYWW;WWײ +^ñ LpeVg +/o !;,ĩϕ$ ?P1tt 5j<.M2jDc܀Ex<<&Jk-/5OitS@1 \*GI*I:b-^ p"!ҀJ\D2Jams"s`+uE{ױ َ˒B"gI$u1Sk]: \]~z埇**$rXo>֫~rSs٩KL+?T*͠u8n1ik_y"zaj`Ne]֛AXbapGҚ=lpTXmvYG;k`g. H@<b¨Ժ:xKV4.*:ݤ"c1v ]U Z]@O{)/S*A^S0F]gZ<@vt%:{:/J]^xA GLH,D<؞'\J$yPq؃l:2u`1QaP*ly@(1װz+p_e_/"6|f J0ū-/WGV/8B$)~m?Hx~aֽoo}6]ţ$ƤMT…GGW`dk?L9Vx d$@7tx)&`!<M]D(8B$#m Ag y6О+2$;nq]Ґ:¾ES0<#Aa5ƂZg "KENzI?+jQj 6߳QsnNr: jtcphP}a,.5f{}Y rG"Gyy,@EArP|5%Q.( !ӆuQߑy XjDr{ iI=t*oOUڱs{nx) w 6G_AIE9:]hʌ3l:USn-KƽBR2TƊ*ui uteir cQ- -x fW˵ *T?j$1P\oŢ$QǫQ/7GNjau4SO#{znt$)|f>zZmaAj!nؿX$j $<T~5IsaDIJnlZ&:Y UJjyr!4u,f"f&0莝0dqGh` x*oHW&Rϴpl(lhp΂keF CШ'm!јפ׍G?,I>dSK>BIm+:0uI4 ffC_q4 X%u@HQ hIY#Il#9rOsH :[ (dʧ[Nq|GH@bdc$@A5).H^l$+z$l?$0B*ܔ8??`&H `3%LCCBЎ;&d9qD .:@b:tɝA@eӦHp(h@ՌO(A$b.v1#|g:Uv]4M^HqzW0r(zkvЖ*ɱ]r%O_arUAq:ɀ؂upI%$B <#d<䅑@6CH#cBg:[1^-!¶ #{k[yd"?f?S%ʶ!#BၾB@r~DX5@tm?Kl,ȟ?*Cb厡v2D T#qJgk1mW&"`sB h0mBôxaLxl:W.u^ y:2YB39ݿHNf4Z?Z## L}:O5EAE7KY.ـ[;/_5 1w60maRWm,~WS'cQͯeeQ !sScD UqV]!D"c j.c1>w^+r;]-> OMTpgK}+M >Yv`" (5(=&*!?vHB)59~ ړx]I PNMYf"@ EO 7GB@O$l J,, m+T6"EkC2D0ϸi5:Rdfvjq`q䗮{u+"f&iGO%7Fhs8%lć`H)CG0*CIçi@j3d:(Y6Q򂽽;f bՎz`tAê7q7̀y%j8nS&M3MI&@?Mn+~--+>ˆff*Χ!p]дK)`M>28LNoP1!A^B=9^ߥ[bHWˍfY$ +#' ox +|*eZ|(A'ғ5ee%,^c:6v 9ZSDZbӲ2</EZ쑎rQf4 tNJv!A|Ȕ<#q7#qUjxaS-6wXt\-;$ DZiGb%0^|,8k i9 00-PM $O61ԌM<)ߦr/oe82ϧwjkH}8zɮwv}W ]ϫ=z{ɠK<Sz%t"vDÙt'R_sdT/2Z0;[GG혱pm;~01ccּ&9m"5ul=~ āueun.:659$:%pCtϊtu$TIz7AN[(IOi@*Eju 0E4H_Nn|}#vDB,\iNw.i\.>DfRx4Ki~۬ol!I[D E+ 2Ao[v(iժ]mRSfYvgVQI k¢\gR>ɸL&UMHh;vjc+6x$D@@i<ڌuڌ+7=E^a؁=N}N$ֱd")-DvZAm˖ߌ)p3Xvá *V *IidbsH=QCuH˙K DZ;$vZFT@80я!A^ݰwuu/}y ŶH^xEI;xϰƼGV:@0x&U\yɍ%gD6͊uY s1g';ƢRP\<늑PJŗ@s"L2#`99s(\)D;$"vݗ rbv`/ojr@.e{ ^+)+H $͇ Ard>_c掺IO_gvI` H۬ӴP_"n"N*DmHeiK/ykn  h9h4D1z+ HrtY V!"iZ #q CWp ՛%?b=XA;! @O9nH@Pm%іƮx?ςwƐ EY<P\Ts5*k0$l-RЧty"Z I;<`t떕!^+XVЗSEtu m͡Psr[C]3Gn$w88$#S$F 1UQBTDn xf*ʪ#쐊0ôr9{g<đٱ !?QȮTIX0H3H{%-7$:A $d>F8YCEv@WyzU++U:H <" ljGAB#%\f5lgN!TW 2+2HB$HJK'A )Υ(=m 5i_ 'C#G@BM~Q80z%!J!e$teB 5ala55 MraAS3^ aV~{5CB)Y6qPo4{Y7h^{=!=E"ۺhȸ=qS_/Ka (6}k:(ĥM۰+$c^cIT[8ddylnR{~k=F"r i6wC\tD @4[s3z hdKm^ʹcُg?+#@MH,EXdCOq<" =I&-W #\׏m_?Hr#L@:&dOl@uy+ NQBv@klHjGcb<3 IH~ $!AEF HP<@ 7@a}%-8 /.3o{:QT-,ި_5HmnN4C]X$0؜NT=$rIU|C0 4)222S7)gI`SƊHe,m^XwZs) zYg T+U,X~@$Tde2TqUVUBHX3IW m B -1X~&?XeʬiHen%xDrBxdRCXyl(y/'޼ߟRC ص@pH څ':8}k& eONeGMjPd$HWu0Hlj~}',H?@1z[̩~mRQ"$5dtUhʍ㰰'mf:c "bZ.r4.I$&TjgH"d׏Rv 74TgLt" ?:pǼ1DTG`]vWм]^2<i&#bd'_I(;xĈH$К dw<\nEHä¼yG^vN.gGYPgJ׹uC.5r+} &goΜ(@bImo /zyg [AD"Y4>+D ڭI Ky}r;$ '^v"es$*0%4>_f:#^4Zewb6oV, tu[z $(xME6] !,!;-N $-n @@QϜR-~ QvD햵&ŀxεfJF#rFMB6(N'-| G5ے+a(f6̖``[:YAVZ6-Mi(04[Q]YݳYG#4"MC‡L.XEZßNf w|jH}H@8:Wa.mG}kF\&3*U<9PΎkdHkdBI"cA =] LW`@JJJ-8KWː68]{Vh!ٟ N-dc1d XBv[" w418!AJNZw GE @c ˀl&xuhL3v,15U^ $8!1aYs8_^YIXDA {i%vP)QRl_|WLARR$[h>5'Q65-#A䦃GJFW.}eOBqҌ[[> CaHvi}QdNjxVTFw"I Oj=gI Y#=K\%=#Qzr裯OTn.u<ܿm8SҾ 11"-ҵKleoKVWUwA)vflq ph(eǒXĘ#Ad3 IkGgD 8Lt xȓ^W@~ݒC4~9{_C@1Pr{sq`skrl"w$cZb\#L]MJnmۏkfcN lɲ?2`E8^9p9CZʢ` Hv;5ɣ l==1 U5N]75"Q7ye;5si{K[90ODhƇT.f7%Cʫ "޳# ѱdv"F!9u]Sy =扖}s7E )fNnF4tLֺkHC;9t=!{5.p}Xlޠġ J͎[l0{yvdL)cj[Ļ=s: q|cV;ƒyL10^Lq1@BNvC£_0 ?y͡G4O,bMrvV6I$^M@w,S$>{훐2 , p8%H96CP =ث~EiaW16o؁E{vݹ͚Ӱ4(ZÚ2'c I 퍡iub!UhktK_D9Cw&C|/ZA C qb%AT@ꨅi,y$d,03h%EZXm^uFcNt"Ri@ #@2ܨi;CA~|_d@ZYOo٣7jvs'2'~829jza7#!;jXsQaMND~?E0A"P3u+:,-0AfDu΄lslEb6i~vk8|gW=1^Bi~ {pX"cgߞ`M3R[^[nqf]J HA!-%޷E,b$,:3bnC ɣЃy)JCrhDBl{g8K՛KHɭe@ 4R0T 9 o?Ё$:.3Hr 5T\ʬN&HÄ8"&Xh2сF>a鸶wQQӻN+Jǝb Ŋժ-jEj)ՆZH4$!G[QT~0H?(HM0;wowgvWuعۛϽ7o$b^fnT_i蕡`6S[x㏟؉ Q";2̮S^[00ZH]+Hd8}y3jn[Hfqڴ#GfǏL#T ,7Hc*Iidͣ7]Nk'q%$u Ty-R NDQzQ]W>~14eq=&IByPxD\蛺 M6 yBt& +Ny',Ї]H)PH> {A{}Trx-DvUx r(P H-ZOruΈfc`$TTBS] Q"T G[nWB*reVMκ t^%Ms"{]]ys٨|]HjG#끴l!A:EJY?n19>m)-l!X@g AuƱ5+ѼPcߎc]^}QTJ}LپB`@s#fSbBH,BZѱ,$S>"ƦNqSrBcY t@;qSi@7UH OS ;An<|b|/lJoJ*ЯDϷ\4]վ᷋dٖ_ q XHy4o7C; 0B??3pX ,puk‘4=0buzE.jNy5/tE (B9~VbExdHs}Z4@R!"4Avu^dDHWI PU9񨮒ɲ}RoD" RAwG,w@Zd$|WJ9l#%*~Saԋڄ\W#Wn<| ~\݂A_v %oթiz٪'.:hh2{=ƨp|YB:B}3] Qj&F,zR =߰=t>H1/EcG¥ׇnJh" av]z I 5?Z0f&—]qXlzGFzTrVK_?HHOj!j#JzÔ,T zپ! >F7 kn(%(5 ?] kC瀩O05}碣E*VGD^eu g&/|Y_H#*GDbb@$GI <" i#qRđ!tOW v[7 ښk&nЯTx3V Qg v6Z_Bzv!}O]V嗀zq:-H-~jg$zZ[]xWpjD|F-xX@_;y-J|JՏӔSҔP4 &8^ H;bs J' U پG%پt!v&{J?Z\$ZOٸh+;OTr<^i|8XBB*V| DD>$T,y.g|'v&"A@(|䣜#BHME}0DVzЯ\e jp~ݷH\o!!cb8_3h!Ԏd"WsGj v\Ȯ*qځ=H4l;oRh2b y(妹_3>7GH]#A H?hq]Ie1k H_%f⺢ġ;s-<}7fs@͐@OG!ra!'Hr ɳ2eakjRݎ+㳴 88o&w,tH$Hr&\N$-$D5( d LHfx!2 ԛyÙ p.6Yxf`ҟN겞f ]J˃z b1`"=wݣ}G0پߢlzɉ)x\@K=,$iءdW5H.fP :UI_>jD@*cHL4ml۞{Hl߻:HGzt ][H7JmƎ~Fܓ6YXBJ#"S+GD$I9| <-Ӽ"yD)'\v0^ФS%Dui=nG LsR e@pׯvˤ 7P= N^a'Ra b;#C؎bSm'ZC+ D0BI6Jۙ,; B9V:]T N/ةr$ IVH);qpĉDkG"|VE*ep"D=$NB(Z'MGa & B:5rpWmwHC)3jd<|*S7Ub$Īj4}dD+dH#}-J+N^8O0~ݷ+lRmt[͹Z\,GLl!ugR|$7쾝RV_^ٕ%mPCp,PSDZG٬Vv4z FkBP;ģ&$ $w/SwIQ*`GHj9~3k Qq~ShaDR^Vku4 Wy-${)ojѨcI}Y}FY]ŷ\sJ({dt !MŮpd|Iz5@\iuɝn(nUI]]YAGVKA NccWF9W䪚X,-HA ɀ酝82,TO.xqk+oYxpl CiX X#ij H2.-SZIjO~q4>2)Tۼ/ Wµbco{Ԙ MV,xYMT8};7k TUkpuUM8g755CMMٓ/7p5^{z]ssպvfuv) X'J *P|ɖ[ Uv*_`sRxbȺ.)S7T_6p6jWYXX_`6eVr=^D.V|^B/ū3bHY Ẹ|^shk^ˍn@>~fT)Χ䷃N&]6Z޴3:X2SKpik_ߋ%w3r-/"K% 1qܯ^U'rOq%1桞g%[*b3}#4~H],Ze0Ʃ<\=G)Srd,"d,\o g=\KѕDd]ϝgrmeL5*]$ƯzWu9(IKJXZr*/N}'Wwԛ(IKB.`UB6!${922j;7e+vwӼz",>Z9+*. )mhf:B4Ey 䦩CC cvK"K8׀^E/%t"\f|m?'t 3-#X|`\oPPv ns @/.c+Rk|o^9LV4ip%6LnC?|bGq4@mؠޓ%s$s.U)P)ɘWST^S˰ڹub%UiZUZEC̡ÇSol=j3:q*4u)K1AT% _N۱JΝX$qat;z!e^Ì,bUҰu꠰ Ia$HގpDH-^u!|U [F@UJZ~Ϟit6l@~qDHr=.b;߁jkNUInG-eóSԩhR`=tg;Z=8 4Na.?H6˴>Y+;J۳w=$")UHs+D>@%0'Hx\e<DRxatDӨu>?#UIPgyiuH`Jd])1Rk%簿H#Ձxd RhW" nYK60Z\iOSs#f %z1vDFDRy4UѫHšXQ,Z?<_H(_y\PHޤ[GyV"#fĀ${j<2IvиH=vd9$OTxݦqr+Y;hCi`m$bvNHNnÄ9S1 E:.NZGq]+DDv3гw yz_^fO@:%MF?>(H^q#Hf4GTV*ŏ5yK`7œDsa7 h;*0p iBVfDRT˙=͒ii.q*@ "R 9HIjgݳq]{w$2a~~'hAu4GBu*FߛЧȡx=/޶K\0osA%`Ql,6K)z}[4Hr)vHs91MW!>1DGHYkHDNyىfO'M2I<)̓~N梐2I?x^rHtGӯ>c}HY]nM\-)Y5t Ss].RH i5ezH(2tlu˯#nR&f&3OTV́RxyDqc-Մy;OM_04+ 1ZN V<%gU,&'.# *yMc系Tړ@;$~ezˣYFFZ3G"V)e|ƛI hӏLDpd<*kflrU%\Nic3m`bv!ٕso8mFŝ&jj&VrZ ΅GD<"%DD"Iў=LiVVFpfB!,yVO[*yr_bAEr6Cx$}y>;igڅxK(HlyRy#UBSF>GP|8t +6$}l1I p, T"y#RܪآXQ)g]KHb"yQn 1bzV|#rH=!H,ypJ.(Pj63sDʠ~7"ZH;L#:&o]e]1HHQy:qx $tu?ը<ÙHv骱u麀SC(6$z>9GDGrE=?ztv[P\3H}n3N3Q<i_)2%~B`K07kVΒsUH:V=<6'gC^ ~{² ȓ:41y K;Bm@.NY3QˎfI$!Bt#hZ^=#M|O3`-^L=Hwu)*+n J$ Ec+d .|XZ< cI;E2H(DHKH76:,!4 ̣A3З&p\4nw\<\)ܴ9ȑmRW6܍v"qime2ss5nanC^ee^+DKגuvtƥ7G/w ڹHϡR L$j$P_h]]hu ˒MMzQ8|@ЂX+gPĎl҂vH)Z#)X)}2ʜ梪cTw3C KѝiJ͵]8[<11\e|-ҥ#H+2!M\"RO:n&Mc+奺+u!X8A$#!1D aMuų]0wͨEE.@ZHVM م.0T3TABH7{{<Y 3563x1R$'IĞgHoIvIC##778ٳ{]{(hG'3' 346HMܑlf.zNl}Tvxj7 A>j#oq͙CetiW"oF㇁}]:W"_Kk hS`]lX\F#P.)Way(>rq(FJC;T 1&)Vu/Xhl`$DwGcccov9eeѬ0*`StYta>Uz>a{n֪XZb .+2]1Q9(hq: {&k,s\.ILaz[Oy"9]r/W}nunK7ͱE.ۅ,Rqmd8IإsJMc)h6xu,`;H@II<󻗶lMf5k:Bˡ]pSdH k#FKj1Z$6.<(3H70ٕ@4I?D²j,R{cƨ5f7hCY3 Q~Yi U,@ReĹP@hSQN0I$vH/o ~m/C;O=г {3j v"Eݰ8oJ/x$D=VǵY$RH`;YarOr7, (i_FjH,^@Β9 %d=A _go]AYx>A ] I "|uTe+WՕPeg-Q||YjU .3>h=YhwCf`= 5lm2H-v@HyLz:A8!HH }]p0 $cX!H#&d c=< (V5D߁KLlncHa@җS-?_'РXpL iZs!Pgm/C=Gv& ~A@;hӺ<-hb1sxNAgJHOHHH-Q"p<)MxTl>"<4"Gb 8"ͫ+^LG!,! D:6'ݶ54'դY$E%R1XHWC > HmV'{i9y(K;H@2}Sւt . ] ќ6HP; S5-5l e3j8QPhe8T@nQ0gc?rHy111޼Vs2qoOlЗ= $aAvKg!HXZNm* .llgطK\Rկ78fP0dd=_ۧ#WW" Lr$lV0RIѱf$9#m觎.+Y G;FRIYJTv!&jBM5TP$UCE GƢBKM;'N8)꼩ʎd:h&Fį C s6 ڗ-.u?v' RS">8Q"':ƈ#N5st"ao^YLHX?hMv׾i?HT%%\r T/څWx#P(ƌQ9FI{TTى)"vY(N\նVtYMTF # u},K$,b7gq =ћea'?l%yr=b'GǺ%׽@@f$ʎ)`l Ƕl5J<eH[[wi:+i_Yȱa}YG# 4yLbگ(q$t@D9(XGHVa1CvJ;TK]2y fI-Z)[W`B9`eJ۽b+i xk[X2K/T!ca RZv9CJ~s*a$I)dt D| !1a1>O>jO$= ?2H%r\ְTbL.\q)iyDb">fDQ ##um,O}d稪R?T*;(&HxV ?ԁzLi$HB}M0GkGAHS/YcDh^p4`~'(gҭ<'t;pk)HNvHDhj]ҩĦszUU0 H4.Ƣh5uO?z4| -n 9훬`o/8g7zU8{$[ =Xc󙀄V58?ߴHcyH)NO%?@V$$"^Z$r2K4і>sTq y+b{:1>DIiX-*T:2 P`+ADBl4Eu Om{pE>$ "{#I=pO&#-e_yGu %9/K=1u$Z 'R{UGV3mGT ]5 k Hh?I[%ԐrTDu4b$xwz} EJ?PѠ PZA /1sKECm~)RK^m]Ld+C-tK}V FUG*Gd ird_NR E~ƯKi*;Hq%ZV /<_~YGfo,ֵ;Va Ha"'$Ge]27A̭W(, D:H9iQTBi*W\D$ م HHr؎$"vH"`␈H#H%WԽ9"$ 8H1EcG)z_p]?::.;TaRmxϋrA!;D՞ibҽ{Cн dLTĪkj3^O#)ڜAx0-(FZb(awyts{$ZjG[aNBdB'ű:O[wkWA]a*fQ I ~<I Hpq}rg͸ /TtgELHיԬxGޟ l)[iáLmim_}RB}vlL]g{V!Y7P9wmmYspQٷ{QC#T P`Dm Q@,Q[Q?!fuS ?"R$]5?ڃU\Y9$G ?z;J@ZF#EҊ— H4iSy O`@j^3 ,x͎b7sdcA>4H1 $ZO.Ns8JjP|$B}DPblU|2">1VVkDR'Mj- A ƶ*B|SZ={{v^ػw9=]u7_8H>V zoGvDvD}UoݝUHjGދª"{)G!A5GD-?"jD)@B '#$tbWTYˁte7fb,! qb'MRufw>W8iR^W5 c6MŖSׁH|x(]DoIVNq}VOUmi!, nF|ibQf87'i;B¢NJQJmuv 9b¢l5!AB)uQ;G3t?:(Bk@*䩃ߦ;"\H?H*egi!D1KD|b7d=+sJKUy+xDBiEc Pq'܈yYBEbn}1D Ȯ,D*G_}\xJM%ZUNj_.ڛxGN@~!݇B(E _)?tяҌYk$G,j-뭭 +Q~ҫ^WɄ達n*;j2kbsEJE/x˫kjllÔ $B0w*1!3gƣhΣ<xFT@XG~ΉDJ T4؆Y!Eh@ɤL8u%H2TKw3dܽt惻:f/7GgMr[~BD1cۨڌ$}2GDPf$y R{*+]UvXt.AI:7./D$cҙ)#VG'Qk{/y^zS>.e7۹@߃B[H۶$x$J`TRӫ.ɚoR?M!:\;}?g@5Fy|BbyckNT*)O`:Ob,$K_^xTǐiG/3Q H>\c-g0^zπD,H!j s,TY'<:llCH<Şbd ͡:`u衦av0)S7 #Nݸ1HC½ Hq{8J*^#cRТ6 $'bXeD y^5Ic; ($QoFH0 aYHjZ9-R_H Vb;J .3e}-K\4YIN%̡f~h[^H}BU?k%g~ή{: %i2]M`[;ӏݕ0Ok +axJ8Jǐ`[6I$_I%] )hg7T=P*^Eȯ\F~|Uaas9MM^o,#1$}n;D X$itz#!Tzp2 !9jk ȑ<􄛀D͎,Go=zqEGn&EOd*F ekD$61W;_JԿ"7A% oC7_FbѸ 73ueTiJ^Bci~B\? %y"@?D2Nx;I|<-,ώn)֑GΑHqvG[ԎAQ˜DA[#}ģ!ӰB?9$"A׭.7!sf(| B> GA}/$/iV)K|k36`UCH`(<ьs;( 8Xɤ  %(=DaGRN9 Q9yX5X/;+*]@ T\9TOҜ(4V}F3wڑc@O1VY _F.Q`/{%J! x"aD@"A@g9?uxAYQQ_9["ޔE)ۤL6ڥp=Mvp>h]/".X\l9ʼnҜ*k\Lly%.]=p~_>3d+ivZ%@%Hb,}J|=%"j8qU?$-񊿌H$7"$unHt~_ߴ<-$u?.9F㑬t5QȓUSx T|a -!yu"Y)hٷEif-r-H>ܛICC78CĊEhBի5h~1Z#qT^GL/[J 8 R%`fEpG$⑏<]yxDG";L#d#u!l$*") 'lSKܢKHQr8{)<.(&{l["Q?䊱#R:_O`jg].u#RJcH/}a2,_>2KGr.;o)iksa$<1)L_}-(NiB0A<""ql5:<""_=iFRp~x{K}d1U#A6E&wˢj-RdHG4na$qY&dHD6$zoI@@tBLGVZl#c|/'Adڠ ^08 Qx4 P5 iŵ8EӃQݏw{H:es#;B~1r>ܧ'ĠĘ}}#rsj7&T>$/4 HEgPK_:2_djy魱'?)v@?D>Iv@d.UU;2,% -#|2o/J4 y}.-#Rf9IYEկ?~!%''@ ,"ѡ]ĕ_Z91©]TҥBK:ٯA[21"ȡ] &O vh.]Ƶ45Xq=FA_\}??ߊ KT>B;Ш i.vk2Ώ}F7 mR}s0\MV8G !9D;ukNoڻ/[hmH! RƏzQ#.yO:B+`AD99 #\Oi`16Ԏ%S>x?KhS'SDHq/%,K/?A]l-Cd泛DD3i3/Kާ*sT&d>=7{/zY5k̮+rފB(*,+TUW,(?u5@腙"ww]\+cl&ᒗGwwMG_ ?0.ޤ~-y W2n\{]>w~K( "RB>G$epz,>퀔:R]]œ;(:?-iKDH68C~|$^s o!x\釩깂/1I&IAdՊ g--);-;))fD<3?g"m3q&6J_{JhmzLfDsy,W8*Ӛ`#g. B29a]׬/ e  GR<[!f>/A͟r}3oW^q*IF}.F:<(p!*l9!ZӦ]x3۝z$BM8r,}9<ܹ_V8_ݠVHR{:ӇW&8d@b.Hw.^aee_zmMzR:teds)y.tkκPE["AkltIq_HO8ŕýwɎ ZՋC43DރB׌^ϿMRQ7MQwF$XYצMD5@8f +AK- ^&(2.l,$H¾mΘJ;(,D.6^pxJ89~&7@" |?&кA#B g,v zUNI qC\M VntîZ, g~b8iv`|ШW4? ۾5umzѫ_[JCD$lVI7`ntL$h@[`(i H?sTXGS^2, 0RH+Nu,ZD [>_j_B\&uL$9@]ĥ4nS ɒS 摬GKeKC~ۊvZ[aIW~2`$=]/*!&:}Q^$uKnE6>o:.=sF+̱=:>Q˶JfAg'ҷܠTGcQ^0/ymǸ ]ܪH =dKxXơ<3XEwimn֬\f ~" Ee)b@:ԃKv76C NN4m 5#U[שDKi Ia޺S=~yDyք="EζGRED:lo g ]>pD R* HXwE<2x,x$[Ht>%$'܂itR,jI+ҤK% ư0=0<Ƈ.DT$H,#&vAi HJ(=~86B'!UϪlz> [btH'ƌUBCGLFy@^#- Mg۷wHKu/l7q3 8cQ/k G4pfQ֯exÖ ZZ>|;!@!D}ۙzg)(IXHSǑGr%Cf fjϑa&4b]YFc|\aB|+bo %W}^J@s&Rߒt6;;vZ5o ÇU^cwUfZj"Hܗ1pǝDIl#ɹdh't\'tt S Y袀Ұ~]5ED"Hs6$Yv}r v62~Ebq9#CI\1JNE@x^=ƺeD!SH;YQn}q}5۷o}dRqE2L0yqNNlҭaDg"}Z y6 tb˜yc&TbEv%Ɵ0f̘ XDv<"ITTt`wx<͞l٥B܁8 ÙǀTTv:0÷?!Fd!u8H~GD"z*zsd`] eUMӦYLR^{zUr,oLہM$4'>仺\!=wqD79Nx{"7c. hxݨ,S׮@%`WEEڂd//x4z!GXprHR.abzGlfT_} JݿJh3Dcp+NT>jͯE YmTvDzxV7tO4XSIQ$k DLWOUn"b1FQ&N=G#Nc;QwB""瑘GClz޻9~I]eᵌJoi<.T9B^"EbqG^3 H/K@r/}w坞*VVNݩʦH/ HTBr_j:h5Ų 5:]X}FZK$"Q| QieXv6YdؓT@EϺ> kTށH+M%@E}yl$z8vYz톞!Dŵ&<%cHK`0gGɟ$ ѩ ݺH%'@i|@*. oO~lNyyF,D+ 5z/\6^vD2؆k@u5 =4CT)nWD*+UɓGѠ.P)c{m˻=C$/7೓6ڲmMvٱtqئ@d " ;FL^4"G` ( MHgUUlEŴi[r"CRxt#@iV)H `/3}=2h#5a~ʼn +g 19<E|8Ⳓ8Hpo g9{7Wmކ--Z6`,$/5:u#@EG ZUqD+>G~3sw&FDxҴ XG 9;nхiLJ H _:8(5PȒe֤/D@|aYbrZ[HTF) Ј,AjuF%-:4?Dz9kDv7q~ԗ]hb'ד鹫HeL 8$THV7M,rurȨW- $l$GbWE aau|@)<̎GE[ Q'W/ݻTqt"1 D6a.;kooDzDy՜d!;Q3*ska\6^AkCLmmH뭏>6σ,?;ØN7@ݟ[XT-_+7XA h+#xetםh4` 6)(& 9zHZ/d Z;ނؤZN0Bf= ɉG$s S>O|>kN;JV;9eUZdrLD48E I%:IVc%K x/s}kUvN1FLH++B)F3̑3m3fIHHmMc-Ǫ" $&.iС:D㻴%RDͅ&)őFt~gs9rحoCp)ﯔinsmL$HB#5 {s2i9>>c"RGm&^@"i۱c.A1d 9*O/Y|N (;Rzzd<SC%=T$I3ﭼy3ڵo oUrK@FIU{ҩ9^~.2 D:n+iv6ItP#R-_x{x{x~ǎqYHAG#΀4#(i^6 J7Ϗ{L@GVؼG[!d#%u'eJτ!~JL$İZ%q([T"m,DRd -$q8й:ƙ::ĖR r$Ϩv?N0oMeĄኖ$5DjiB!$5SA-$e#0cK.ޯli;mQ$1ώH/ >`@::J&͍Oyy56wbR'sصKLb9v];ׄ>^0NH >DDMCJE Q4W[l,$ERH@Rt:X xD7ٯfvoZ(1[C uLF|Sވ5%8Rm$ikP&% q];LV잫>҈JAw<yF)ߔW|G)-N}zD1̛e@xuN԰j<_GA'g<ݾg9r$aWFwLΐ ݀8B" H9n$H#V R)!CL ]t_,$}tC0_q!??kqJd&X*[ iW $veuBjy\hI(@$y cyI >;89 M,f""ڥ21 D3 NOw{nnz\?:M& }6:H&'dj'E {Fs%h FkY`b0b"R‹P;HF@ݼF^4s B475m,} 4'mmkC-!&Eϱ= /Ζ@z.Pp<#Ň9>t@WQEC>|#D@Jj2"%eKH[Yu)),w  )Ѐg -$0!6@c/|v&߇IfbF0U v6ގ,BEv7:yzaW BaO ::N,@_hp]_4Ƥ]>]/IIؠӍV~.dy~KOSS?n$oH&1)6W?16DjCȜ<;5"GmW[Q1[y;^mުy=p z<,W^X9=@:o}߇fd8 Huyug*[RmRN򨀈$maX;H\sÎINjꇷό#" FڂCEFNi.K` e1lTU0N۝wΞΞ LAvz %;Oao `HK$Xp,EUnlB_nlmuަz\ǔjߟQ6E۝K .M,H@ t.yeGjI H0p$Σ"ECAgG@ Ҏ?X Z[;;?y# HCSH2@6' >]b)@Wc\iy\r: $y]骑jE'h3ɬf a90B"|@CG'uٟD4T"~3b33MZK48&qpƦuh^hު2oSlio( $YrN5GJBUHqqqQ~t |CyX H4havavxlGط=y2rUqD|@IMNA8^v u+Ni@R OX#"0)!{5P\oWI4 lFDy lTfeiN,n2Tu"qH%QX,vs͑mc[zP{uhHĦd;'6Lha,P IpJxOUT 3Bj0i#/BMnI!nŧN@ Y/qcGGu@؅ {+)ce| i00E5k@>ޯ_xU #cҍK춣y^,$`FD$?9BdAYv'?p[J6 15#c\:pQo@:aR{ /9CH×jX eKs%L$(DPh"C\gV2vO-A©ح[{ja'"=x?Oq7nhwH92^Wf7p9J^^_+ 0&y>  ƠFd ixxI]PGD$yrL_aE92Ѽ $GP6 K>4vHc=Y $PͭhҀT35L@z0 K¨\׆<RHQ@ƁH#N$VH"Ew!yYH_;(3sBB@h@ h &?R#dd&ڤc3vڎ$GMH+-"JDDqcJ0Vi2{{,د]^w>(Gv%.;}i Ha5}˽*VLl0Afa G'w*uҭ;_<x  H t_'|7;)/zgcvG I ;"i)2xPP)rI /]G+Ѵﳛˈl$x:@wH,eUwjZH:r$Q3H݋*LdͫH RgQ3ٓuww@BwgD5zMM) (LFY+XطiӠV.$>$PAYTN8o7^7^gI:4w2R$IGw[~XlÙ۾@ѷuH,*L$8xAoJ =J:H |jAO=f@J٭I}/-#NDHG8Ea v@@~!y;f^;ZS3sښB y @oE7bm]vBRզ7@ ɳO^=Gf1񵱀{Ƣ /\f3s؍DZܡ)Յ7^켖.{Qvp.ޚ'OT݀\v-gA'zxgk&p!iRx]Nry~T P 9Sӻ5m÷ ];iQv45_ 4}3$$^`ƍWƉQH5/)i!ztvwE3>NnH+-ib@ZY2퀢x}3771]j4O9ǽimIm`@ҭ8xdN$J*a[tp%v kBJ0"Z+$ ;=N~g,#/p VXL(HV@0R xD P+)cɒLcA[dIF Q>$t_,7bQrW.v{A U6)]0HvD]PC:|yeP#(;F.z-E[ : }W'O~Յts }ҵ­[S.u/`+=D@ڽm΂A +xqm͉5Am jju]ufUe jB#op?q qߙZ3g 4]ywx14Kpb/'^;^Gn~8 5thEӛo#ݮ}Cېn f&L)9̭H 1u9P(|um̝v_2_M8оJAd1 t}H@uҼԂrkA(X?7APbjPF|-kGD$G G/du ']ƣmQqJ%Zvs $-;D7 BGwD#Dž\e<@J rԑc HmGo5q-V0 @G f!aMg_\jŋoþDvFEO3>m,׷yD% H]'cy,Z&GjDp$W_S›eu+.{H F7&$þ7_<~k5>ڻʨ_US[S>pv}7 UA!E~ HcbЃ}~@q /h:<.Ljdwmt;'|VˮK,߫|N}jWđ#Cܺჺq7&xŽZyyiO&uA}v6#VK@jb?p 5D4u8ĜvAf*`,)VvQJ4; y @R 1 ~ vX!kV1 E_uҥ:ic#A$G|h,y4]g2* vѭ/ŠZA dA?\o} j@$2jy`؂}P;. ">>qT(_ZP) OWā L #Mڮ]wnc®5 ̍ɫj}6|*=ǩk3/ހ%Oګ1#7&YH2.X$z9f:LT_M۰'DMM&[KZALKi׈H.e%,$I5SJ62 ifա6>s~37wj&XBBK䅍TT4b^)uWC_'{E=<%\v$AR:y*]X.J[/z܊ڥ "{HpR0uPiLd)o7hZ~v3,28BxDJh'6Xi !͒-},B,qY%=~7&yUSSm-؇C†WV^YV?|!Zo%c&ZQ(UTT1E{aҌzɦ,;;@#쪛$Xlavbb$ H\`y{ȵGLoRt*w.mp]>/-B""I]?ÏGӭR{OAic+4V7Wc?ԀvU=]/tx4k"TMv:+:;f #]gkRet"=?9B$"Mck|͈nj{hr͐YLYKyTNE0R.AuXDz԰"H)(3 b:2.'6Hb.X} EPlUTz!,-a丷9;4jf{g.ya1^:^V,"ҔHRu"}'GID_QSr!S`UF) Hnҹs.(N$ !{BrU_4:>]!D.0@p$qk軥. x`w9DW%g06H$&ܲ}:]gǏi‡z !P,#K{U<悗.JKEEIeۢ+7 ]HBGE60OS,HG}H;|aÆU6t; 6rLO!ёCyGOba Ba!cv‘ ★}d[.~#glNjZZj^%"I& 怒zH$]?OtA}:Z \G$A$ƠjHvD~5HܼIRYJtHExDt5W/Qt(1qDrHVbϥ+/qi؝ouSIYH].$e(s+zI00,#{-)X@8TY,H@"#ӷ ?6+|H>K>{:LJ~3bCf@:󟛺M@.+a).6G MUzKFR%0{ ?P`\4k@vE-Hmͣ0;-V>$j0n8]Yy^Ö_c !P91y$RPFKҮQv{"@i@򑅄IIWc> GjT e SW:B.@y\.BDiRȽH@;B'jg#jlohXo,jl,l0;<=}$H7?\sc,# H $ӛ(͆6Q>!#=I wr]Vn1`@~FYHa#ɒۅ0Ub~ood: jˀj"}~5Ly|?d{n_ݟ<ӸuV@Z<3#&ڞk#Ho_ #EiMSanVUZgv*vik;nƌ&59he0R?xR5sd}@" ATPm<QDv="ڄ4= 2VB47 \astFw!~ .?66qvSR56u京l0s 0Ā!f\ Cp44e>m/*ix2\@>ٽ?<ӬIdioj#oEAs# L1kW#| a~i;9G#=PF }E}OaD:SR+rs@@aDB fʶ%C]98a=azӗ1pBTqP6񯚾>]H| IVI>H<"e߰HJ-̕zJI^|kkQ.S $-M3+*HHWWJ{l4TWT;7-pO+3մ.˘h=Y j'j퀤:FGn瞞-$}j H2<g>s<[׈',7k:r98u~ d1W)CH8Nobw-RyؘZNEaa4 {6fLx@lzU>k 8qcGT5&e"g~9A~<0(MЈ4*XJqB$ LBϿYb,ݴinq4w)3\ һl963/SWs׏s`ԅ -\85JoHv7y{?#epp%]g珀J]dISpU2F?peõѷ&(Hc)p7=}փЬnu$=fDӁH0Z䃖~rlz슿IlT;:HK4( X"?} ܱ+3%aJ ajeՙF N:۝w;u~w;l@3G BNzsTUh ,ǹ,MsRnzwk׻eRUg>@R^zV,iEHXcfo~}mV}I>]st[[,p5F-@z9X>z_'m|k\'8  ݦgw/5XhniߋHp߫i0NÇOhDLr6v&Z|W?'kG5blt5Jo0F$Pv&Zљ߽MSGQ p7PV^!%uv)S7X{¢e 7|iH#GnlXYclsղ#8JHIII>}ie Ҕ SUDGX#EXBHiC@SL_gHw8mI &vtG*0 !=0ae!)ZdbZJJװ(UN}#)mbR/#SiJ)s@㼝_H#)~wv7^6RQ"YiDO9NJ]Ru63}w֧( 6PJP5rrh1#h~>գ& $%/H} eYhqOv3f>u~ J OH#==Hi:)S0Z#lNd5?W p4EM݈&,:IC@bDj7S@$X)l~./pLtu<~~KP+:#3VިĴui6r)6TQ"Br$J, cO=BլHT;NR~NM~Md)5',k>l<ӵ@h{V+_g\ТT9xl5{?t.:5"HJ:39fIKkjjlIKtWӂDW6/X$T ѢSU5TĴom|'gW |"S)dګ^rvڥ"ځKXoqeGDĭ,TԱ7GRt3USSCUɸAun1YZI-s"FCLg54꛸MHW* D|H*u+'GYh g&i[-n"% @$L!iSzSji$f1gש6%Ei#!"Y='ݍNfUog} *{ܺ4kάH+[FJa(Zt0%#Qf_-T5{kj`G[H$N^,HImr$%.nШH(ŭ(IXNU H⾋pS>()NxZNIrt^y+K,1[8"&ɗCb6""AEr\Wm"Xe4"᯳}AvB $$Vx}6)9]F5zׄE6DQim ҷQmUE4E%툴%t/l $$rH8>j'tLgU J7DYo*#C%Tq|v|)Kn7<xXYwv~v@h/<'σ#>_pᘊ,)5PSր,@x*G(bH" %SE_jHZS5>*H͸0&t:{Ԅc *\vDt kuٚpdTbcAZXb w'=0a&[76)֝9ֽ*]e-+mt̓V6o9p3w:WHV+E)T3Ew2; EQ7L+44D"\+f/ B,'gIHvemmoT֞DA f6Qb8R' xRCHFýD}\OR۶M2~|+2!x;vz¥זH8_/ H-@Is .Ӯs tԋ3iiv;zzVpNOL1# -Oک@,XΪ0DB"'At ۴UԹÎX,i%OEgr ^Ku\|H#U5W;*<~>5Vz*q$HDBpoo-zx_jcxQ~7v3sfK14 *Y{ }gLT.քY9XuЅ bJ@u57{ZZZ1Iy3YYs(X Y+§Ѩ4Pt"qLmpj!މ H$GZ(sW`,Ђ;{疊Ҷ Iɇ+ۃ8Ҥ:beei@rYHml+!&ys@H`%}s2Z~5B ݖHS@%J]oS@4{"Bsmۑ&MuXt@252HU_^Xѧ} "Uy?2NFB7 NÚf  ;yŏ͵S0b@JV=[͝->1FW_3\I" DbEmmfQSpik=SӲK6&צ76GolRdn9]&QJ|u&N7ݭnKhgXrw=-} H<-{o˄`#Z<֋ 6“ca mJۍ&0"L>qibIpbDڡ4}0niRHBʷIq_m $"ٛHy  @IV֙$ŤIHv\8av.03\osz)<Ҫa˴r ɩe1 UR& F@$R!XHL 8)րpH5n#L?u)` M2/)$މt .Z'={N76X^~ K_4 %^a!v#;NIB;aq(T#A;=$Lg&HNDH*DDȀHA gރo_<蜶);T "$mvu.>8yB2ń8LJ]^cŨ Swޙ0jb@)3;@VVf 5=flH y7$$kxTXhtC^wi[n t>K-@z\BVm HDlϧHPd 1IʵmE_Ӕ涆)M\Oʴű.EEMJI>6ۜK /4s4UYNK|%F%fEʊ&]Ymv҇Vfsi{:D{Ͻ{}'hD((%dCAg7'1}]0SC( |0`DTM $F"; )x~$jͭ(b@S:k2jMm@ڶQ,,XolgTd< $# ee"gqSr)œM_:v-),}0>CƫrˆM;N*oA,b:].ancb;!]䩳I@:>l>۾LΆ5AQ7ٰ=;c+:@XBo5ڥݞ}aoPU嫚 =]G/i?oj".H|Yįひ'} W N)_f2%U-,U.0}M pF4|ׇ]ZSHT|A45-=Bo\ ' ->%DJ*1d w>n^]؉ЉNEՓٷ[5:1@zJ) @Z=jț H!Ҁm202z|%tLqn |*REJ0Re|hHIn u"cKgKm2F Auss B_ PC?FRqRD [x[l%;ƟlHLHSW0S\;O4 mmxOޚRf^WQC._nUB~^/|SF<[,ڙIfRu\ 8E6Wmy&@.Hk6+6P $N$(.o,vͻ$h{kQ#)쪺Ƞ*%eH_z* !3s郩)l&@R$FHR? I.XsГH2 Hxz. $i U>HOF ׯANu/Hi>C{+*eIH` V!Hrb?UF <Ԑ$,!)hNDJ_,H&L*,2鐼C!E =S** t?5OR|L$;q>]vU;O`*n|wT3ȳ% TT=Q$!D?055P )II8i);1Q/:h($ M,=ľ\t $GaRkR00պyҟ)]HU& zx8$!'كtb9G$LpMQ#ik,ܩX1I?Y H% HH  E67\"4f:hÇ颋 3$ RkH…P>$ <DTpzcOG3v ҧ 1ݢͶ-0W!R E\oF($@P;1cۂs%eE#BH6$N25@R:]kGU7zyHsB$v8+ |v K.6350[9s[iI '3R(y%M( 1 :8荲R>Jx4"< `[/5WJHcR.AhAS>MKHoKrC!+nJϼ&Y.Ie !"1zjkhR-6/=j^%,w| m@8{> @Cjb̫J )g{A#S{ H\Dj<+)DZ>)rnjSE e"R$9κބΞWOM%'fݙH3 p N96M \4M ZdjP-Ȧꃪlj1N @&.X?a'@!=xZ>ħQV  hH s :=lҼ#Ud+1 C . IGf kjE{W\C weFkYM oo_O  U:e uex\=HdN<%U#1_zq6 ݅ IpY,j 8ђz X;膻2!v9ta~*: .79nr1˘T9|ģ@Ր1IJLCwtV* gD~?!H7, ,BYD Dɕ,Oڹ\2tz GycW*Gk<9d DJG<[Gq$+5VTƚ CZ:s?>vba8 l=>źi-$i#d_ H;қЂ*妆zS $׻.F툓EWN0YBf+,ھEHYlxIlߜG+}'&Qw[}wOIgѥ E$$Ͷy-dX/J5k$ILь},Sqq=-?4}yūJ űGkAS#W1G~nh/ 8XS߻iKJ Zb]!e/"@θ/I*5@mߊ^J8R(2|L/o4m~!k oaMN^(L υ816uVjcCڮ(Xߜܼ~#<1D¬H#Mw჈>N71`yG%N 'RZZQ &h7iYcS OppnN߳|cE5ΫĴFrG* Yeҽlflq,6  dWCrB;Rxt ]Twߍ8i3r8b"'@:I62 &' b)[LR X[-GU.I= ӒɎQ>q)m?G7рAGw*.l  ,42ScK!t\C*}/Bt\F ^  RIm6Y>;] |*26lil&&a;\rgæIR5Efv+oN"}T~"`Ɖ,[)r i>V5PUݶyA:Q'u+_^ Q|kк;hEt*g%X;Nbh;ߘ8w]'w4 $b)%A:/#?[ѪUkֆt*Vn'Xaca|t}?ιy8_{9?'i~y"bWLAgwӎ!5F q"LJp !J] 3q*}F AL@$x R2% $9l^~D L&' :2$09|)-ZflbRih! YCY H&"M:p<-E<w(<#23_‡@:\_ ]~br@ZQc䧇RHٲk(HN?2\w,;&RH 6I߁b~אr UDE¥ }:NV8bF?j*)DƝW- ![r'U⪪U/-,~^P\'_Y 3%[PF*ҥ^Y4UQ4xB⪊ .VPU5?_jdUWW:\J? Hpˣ̰+6 HG Hҽ%OH$h$`=H n1 ; (C&qR?tc<h>;nɲIKbėB("*~i!@ME\4~ i ݹ(A'eeA  =v&4AhHEDGQgu'KWUHsZߏUdR!w l7nc]'sW ЯO-cG@26j]9/6Nm?_D󀅊8fM(ԉ(l*zHzROPGLT r}{"85 u.cn HGD$HGHI2ήH0"|YHgYB~p.ͮL]IX¦?9,V)fڞ8ܵHs: @BNcQC#Eoz|S'am94MW2ݦD"5Um˽%]vk椬DDZWDE]ɲo(x);ggiPV,*4d "Ӽ%cg5 MG]VU9tVK\8UIn]<Ѡ̣۠<.D 4UB<ͷ{x%nƂ6S!6\ T6378wH#J<Y$شeKEXE%DB' ƕAB=61Zs AT:BةVY=bא5^6F{Xtꅌ@@t}Ͷ'KCI{->V2 IV >{H Ic H!z̷Lj5]Ig9b "nR HL %p"]U]sw7CGGG#D$yDԇkm Y9Gt},Й)<. ϏT2>^iw=LDN%( q]f eZ}Ԋ<0L>u}Qflk1Ų[ anZ-Q_EPя)4)S+<2"U3gQ|YBH$ywYѫDžY@l*29}Uɔ4 jV,DtġCn (޻wW[ N<{rd ܡɡr-bH"Π*~KYvDb(JIvS _@ZU!eQoMZôڷEHIH ",C,".|j*0 M fRWfYHH_k"HR G JoL/\ 6> ڹ8*Ƙ2N$7` g=U>v?#ο $b眯 ͎UY7 zeaIskְٵu>>bc׭{q?3Gre 86@D φU qhn:㋉U/H!H),Hv|V#BIv+sTܮϱ#:cH` :C.D"Q$vSoܸ>E;$BRf+3 -${kqIH T20h$|J*M!ǧֽҥpCR$S"H<ј7mG\dh@aVa#9H$G!lG(̀tOTY!]XzWdԑd]ѫRD~Wfui8Sƽ'ęᆪv3wp\, |+Wugo䠲s !i&;٭mfVFkw]BXՎF\mk"(yH(=()HxR^̜5Ow~sLZX<^}TB$m T^VHMSYE}ý'\_$ϐ wB0$)hVsUϽ#b |>?OuƢ5oT4 $<A!ji׵u#W#갭ZB?FZv0h좂["`dpB0Dt8I'h]KB sUc 1 ɄG8@R΃%yvVh>CJx}}g#M[p'#j~bu彣==GﭬNefcُ\0Lb$ ĻWI 8&٩߸Zw¯9 U}PRv"yGx!tQո" r쪺^<C( p]|}׽KnF$i %GXd $r#J.M_R+ Z oO I٭C_")Iة̉2ٰtBa.lHgu YRoN~1ܓX;GpYA?D O 8=K"@B?s<3GlZ LjʃRJŶF-{5s rr@əFڈHFzr  CR= Q)> ^T^MW_ !PKIӣKj\h|ID:btd>t[nj*kZ%[ fd9O`g\.qev3xWc=~֌w{oow踍#+:\WB]$MY VŌ+lxffqۢ cvHaHM@O#]4uETE ^xG#y %jw:^aΆo^gu~Ȏy1*5H%OZk$^ˀEN5HP0H ?^ObmdPk].7|<՟1B>Z 2,4UUT޲n-x[ٟpM&hP&2#ΡnqmꬻԺ ^ٹ'^ma몎,Xաr3Cv(zsY.,ζ}L.M=U5!58yl'לkp9,x Fvjϧ'nݡu~}Fl MnR^-<s /{4>'L;{6ahr"_k.yLFaIW娷SΝ9rF%r;Ձ/k{?o} Ymm1iLSZ K^욹m]/Iuz)V8犥eNmnBl:X7&%: jJd*ߴ˜UAvג[P^tRM#"f:>Fii;x'>%Ҵv5wnC-0;=# pBoG-×lJF d FFv o߮jz+tX<;asϸKJ|!lcڪ8E& D1̩S3:2KQ3|1e3s?#V-St C.2+{ Mf"&~=O=rw9yjj;BSw2Sw?o?>;;ᷖ;^9oQ )Iᡣ6jh/*:%V]kTuVOozJ ri)X 9-}HS G*-:~\.mlmrH1^,tהWe?%I}dY"Y2Tscħe/u]3þ7dm7%۵ܹP.2I3 -&@MN.c"xX@r?:֥`yxV1a-hx_("44xJ@6!ölE@nubvPKDoy/DqeVL:Əq'Rs2]?*wBWG =/ubdP]xvp -X"'u>֙QKK+MDA V~(3 GXA74`DjfYOqlR_n^0wYs!TJ-ڑA1!"9 (dX <%6ҽF5'Ѝ7reT-R&U˳bĈ&1NY`DžL;gUj+R^(j%Bƒ*Q<Iz>uG]۵3~ܓd HxxѨ8GFzg;~C""Q8㩉&t[^䑘H#C/):G@ROA$H+.( OԼvRD[0.cֲdĺi*"h4MW/iKjlpP{םKΩAڴ|m<ˍ-]i?! mOVB/v%8?tchd\ UʁloIAd\t"| cq@ww19+'W :@_ho"y{ KU4@\s(TMYxG4Bf.߱?xiHBg'98Hd-]qΡ%!4pBb}HTҪF搆z.!'t<\Txσ7@͂7.pښuP:#dfV ڡH.H~:$xs-$1\B#beׅ~dw~T "rK֮8W#C#;͉4bogbU_7hw7NKN R>6CPCRos$0ױ\ K7~Sk~c#g,K\'6 S 0Uq>+p୷끸HZ-hQay82=hذHn"{%d[#$+":KxbAo_ OT6FyHewhZ=:7Vֺ! LeP4e`u2RmR>=&G U]i;>kXl- bpҳIC#Z؝c%~'`*8=i 976n3a=6rҒH(l LO$ R -I},GG`̀p/.)gfH|f _V0X%X-갵a}]ri(2 C3y-+{RBfD r[CZҚ᯿U2H"F2]?ޚ A*CHvS[) ]y#RjXr] QMaH5HNѦ&I~U޳ԞRל2 Ԗn$ !ah2bzCbÁvG'^BG3,?ym.*s.q79"=G,ijΎF$vC3CV 'm@P[~( knnٌ,DIi7wߦ{ш4Y+ PG:5/t"e_,־hV;hZn$E}Hd ib&{zJnY$!8iSOTu֬39*ۼ`f2ml:-ߴl_U(]oqgL<74',uGꪵ5foP,F:HH@g")DrOUNIIG rO$6<*s&Dh@@籞wyM*oI Ħ[P2;ƀt:K% -;;[oyG.\mA"u*A ^l[-,o8J7<Ϣ\f:30gYZRĀD)M&ݜ[ $%Jh`=iYڴGiOb/u[?McowOL0Tpb^|b:iHi $!babvj%D$#͠C_o^6dG祊; ޯ)TvVm=&ٝ^"DڤF)  i .?c]m HBWjG<#D m-פ5?$-i6AjNG$Kn0-'R :$jqUGuIvG\H@FW_UM{S0 e˘uiPco@圆XĎuYj0RXtjM*Yv_~{Ϩ@R@zv8 /<˱ SgkH$pJ8!'Еq<%a< os1%U\Mkv$~*"ɓHts20d[6Y_B{=lo 2d(yB#-b) w"кfP؇r˕*Q TP69fޕb^b(#R YK D/rt;qkn=D@Ս;#e@@GJMQ1! Arbۿ0>\oazD~ Tp5nbqKE%v " I]+)^X:O|?RoeePX$ z%2L>oqCTt[./;"VfinmeܫaZJ ht@ ] mC<jHsp>m"Iژ@;Mn{|{'? )8*ej[\޽*~ƹY0x &e~DX٠Mvb`sZM[X v Dz4[\],*,8lr-@v(-)@*c@,b( lLH$|@4r1D@|$FK:k ,PW!)vay:NKH2Bj]&4!hZ}low/+.#|;&/pe2&WH1;v=C "iyWĖxpCXgJff}#]wz@rzv[pdKiϻ1$$.t?;Hԛ uk8nd)7сo{Ȉ=$sz&mY;zz=b/4xvHݨj2bcD$r,ir5vH8+H$݂GCBX<^O^$W9Y,$ J ݁Yv~dD*\YcR$!!Hc %9zTrdAiHXBP meBIL"MщAŮ+ˠ3-B},@na$_ˈhdR.>jLQdAZ%]rYUϨPˮĬ̹%46 xܮ/c Z)+4We&dZ&ʃ(䵴ۚ(kv"k@R# C-}}A$Rd}/NI@vH.5 p [|u>9#&aۃctɽļA%nR,\=(oPN&ϙ*xDj& @eaFǂ#QSs;)k/*oD*T3'VH9!W#i-Җ.A9,^'HCfd"CPvVP;0L4 X;˟AH}ʔ+ 4I툑5.6c#}%%q$gܷ݁6tH6[6>/+ D9f>Tm궛ʽV{REgzMn HHϤe@$G iON8, !swd ّ.F<:A#vͤ a(bʟIzcF)#>f,AۤEIY8!B=4NRLm `Q$++p-ʒ @ HA9cBс$] oG&g@Xo⭜!'8??) u"!{4Ͻ΃-% '4QLݕ?{_؀d쐤&jft =""!I!Y]F$׹<.g@*+a:#i%O埽gO~~a$i @)T83krGA$=鯋BKb7@*.Ib=^(SD(U"!AJCVo/rzޝX3yH" VH0HPP° )R cK*+[۷ClA{I<H !;߉{'s1 0 ꚁ8,v nటM- 9$H(&8t?TsTM(;a@Tiv.aSX%"B'`> %Hs G#EU U- ꥳaRҋT0C#Hī$$pw:#aVHHP:%ٍ/d0\6u9$!N v)hC!H?&riHΥaX$wݮ#l,=@R;$Bv'B4k遱N(@ V>!im-}<^Klke [ 2Q'նq;]6`ASu\pVE_HkCdo*@mw8+2Z#.x{aqJ8-% D́4яN}U Iś79|sxs1p*+<>4TyBVU!CK35 H`38gL;Rd `1z,(@|cAnd<}f8Iַ<Ŏ&غXj+L6Q!"He gDzdhX>HJ -Gxp8GбIHZwxsxz]?eo*_G_d$_ãHoRj_6 A;} bF#By[{uDpd'(R80WEj`h3~uRqP##P~ρ&5 $3esH HYY1NjCVԎ y1!xD8b!Q,}2 ~UYVthW@!" V4>1Bhgޥy$~SM+>wnz#x>U}Р݆-]HaUF^w]\i Թl,5!iFi0HPr8CBn@HTj @3kWZQNd 1y矿p9 ힿcp4gKn9 DƝ/CoHa q$-;"cvYՃj i)Ҁe.>8p8*7`H"M@DJTQl$f<`wє)SOLyEHO͓|!΁=8I* #O0cRZٸQ9A-)8/fT9(6)@ UV} 5R(훀(}hiߔ ckNpj/u:ܵ c( YU,W#wha,T/w`5׮;nia,e3MM!,@xhaA4.!FyȮgƳ0HP%So cO#‘E:|lԉNFkʷ<^Ms@R!QY:)D$ i5M!R 0O, `u[ yO.Oog,Ao[P*YC7Ek)Hٙ с4km*iCb,a}f#t#N@J8,b+6MdaR,^N We Hn@:@>ZvB@ VCYC}$ i롂F$CJ/iI2G chJS ^%OgPŨiaa*BAq-c)p2 EEDF(dp^oE]dAړmSTWT:j5lރVu?GE7-COmIK A-G͗>!υ~A KEt^:_S~.Q:<2&g`Popř ʼRX 0xD@fY+?Y$kqEĂ{E} e7 [MʹCӰJ6Kw_m^;+za(@$H, "EUn;#?$0]xN ⣅X' eT.Ē oHLok1R8a<%@a"}EΥѣ)]7*C PأtJwLՍ=:$*D@2iJii ~9Q\_`!;*HKc(ꪝD'Ȅ Gl}rϥJqUEu:"Y\EbST\x{5UG4X+igG a^\zf^/6nk1VRqUX\5Gɰ#͚6ȠP*LQu]>x 'm*Sܰ]ģmn됚-!QZ"RQӥm[";.iH`pَpI^Y6&R&=^Df`0DF'"֙Y2efR ͥu^!]! $SX @`iu B J }F@S*5\ #!(>#dFx&أYYvtjtY.3R.f3ۤ&HP3_S^*=Zv%Qq QfW8$"Lk |hcI ~"J eܶ9W с#!HG4pWOB 2$Fy_R;Tm^UĎ])tz_\ Vy\Hr5ZmFh&_)o?8`#P0I+|s lҵlf!!GX&k@SӾy(l UE4BDJ#KA:rC@") w$J٭JǺsb'"L"("o'b I\ =Z23KpHqH,0]H0)?~rsB C lF; -> /ՠ|.U }p~XN]nqP5Rz-e#1EJRX&T L!EE$#U}Hn/˂ImIsfѠS>~sHb$ UHģ6C.b|: )GH{Ix$#T,IGhR.ocGgΗ07|eZIHx/;2\S춿G/K iw\yԩ2~DʄxYu HpDQHni}?h )! )zKjN@f<0DZj tٙ0wȓD;m sKF_R9^E0"RTr}7cĆ.q s^ Hٚ0? >M<;ץO& ( Cbx|G-sP_ TD2Ӯk0hJS}G$߄##?s * )'n^8a'HZZZ"bG3НB$Ih pP> 1?4SyL9b" IGDhB $Am4zks@:"֠S[kP0x$w%=ψa<‘E#~d^YyUW 'sTq*:S (0?0hVxDD3*5&ڊ! 峢ABbϨ0ԃS.`.s* fT"2M]ģޗGwHzQ]$nha4xݪOr8#+;:4:QfK$crg$MNÊi,._}*SS'tA$0ɪn>QelGj"-$#>mw(4dD@:,r4)$r-2#pǡ@]Vh {Ąl-ғCwX$Fl, 1Ubb"1u=D݌;80hn \!jC)}( bHZH#P >X-EI}gc#b-bi|mOEmc4>*vov.͏7 q]w 0%$7Y$(? # o:A"<(hq(ԭE ӧP0J s1 m€9d @di3pͬ(Ф+ 9#i9 _D!9%"ټGisrPFrf9 z{#( IX$8J%3GnDHb)XfHl SG~JPY'#w5S;Gץu9|C<-\7/E*y|84w~?e}/S񈮛q Ht]R 0xSrFG\Ҧ(<xm%^ OW&5G\%" 7h#`3kX>N ,Ykl: v$͉bż005ؓHnp:9]ZAlyrHY3@"?dpvF$$cD KWW v )Vk)CH\GDTJ7S ɒMs]G EH7oț%i3f'zc۶7$ET މ־{Wmۑ(NV9MHj$eA.sҲ (g:GT].D%x%mxh#H֬Ăv% >|F#!pI2%LPTHKk%65Ȏ F Hy H~DRz$Eg!m.@B76j;}D.٣s6RD<9"|bGrmW}v4cTI#wT]ʅӦXJ[2ώ$64X^g J~"h|/ҵ"AOI6,]7W f(7x__ i]W*̊eIOèJ.#TaD ՖBhM26A&CZOH/?cfb+X=ތ€T UElIFԎ9F sHP {s,m t]| 6;H[GtG^7A Az.v8CB2G@"щ8jS&,Իuzl}5PiC2Fqfv.a(~/¼l%dmiji) \uU g+S>s~<<\(WkE^.>kU~N/W .]ĵ4/} }YjMyxo+ilsUCc +S%u+ |9Q]Vd"YfY|ƺDȡ)ۗ,).+҂\g_x5D"XX^8 |.Ns4̠Th>!riK2 n8lvtxvY@4C ƇQQ2Pnv~OqFa0K7dSSB$R&3%5k׮A8\SZZgk4KJygvڄD7~|Hlom1 pH(OVS.PTo|3ٽhyOdҾ{>An*Hx ;<67ų-qd ;dPޘɣ]$ݾ}CCj-TmΪC r-ww}MdU!f:7=THiH|_ŭR9U%M_˹<)C9 ϿQL({ɵZ`L2~5/n'ՓZI#K4e=ԼN ByPG{Kwra˷SO CvyDD~_+u 1 v_a@dXmnpgC<ܓ}_A[4BCS\i)hB>gVÓ4Łl{Ȫu"RaixAxbO!A)61EC.Ѵ"fht74Z]ϓoNB0`ǬK!\yQcw i1:.Z'6<""y/rxm^cc'r^kJ.$ -ԍ ,KB  aK ޠ.aw6"Mx2*rIK)QÀE| >Q!Hy Fp d58΄X@|M>=ԇobMtM3$r*Gi@^A}Sa/Py@%$V>9wrH-nݺyB }wJ"j8أ>s7I&rG{& ; A&SNk^v'դ(U3)qn2FmHuhaj{a;68H$x|h'OC<E :Z8[iUZmW$88G:]7QkA#9vZ|;Qr|%dz q`CrV_#HҡǶta ȞC)0,;ԕ * IQkfb D>ԽKbl뎉%&`~Pħ}=6G CMTeGq$(\`4(R~8 zR~eȢ_ӐEr# x r$4̇.fk.Ā䓫TG"i5X rR[$vM#[2sρBx@>qiz:CM-P2:‡v3-EH*-anzTG\8޽e,g# G/K`(ah3y"WQX'{N@Zٺ:f```t&L <1FDjSJwzR[Ď .\+` d *7尠r[m%&=dd88tx;Gnځ H{WWR`4NNj2E{1̲/Dnk4՗ T;:?V'󨗑H*FGJS]bFVly'+' ֣oM} $8-v@(H!ΣDt$帧REFWpdy"Ǻڵgh(uT|Oh 7O<ژgAڏ+Qқ6b|q[P@#덏Ǿ6jH jK2i) H)Fv&JLi1>Ār 'HC9\ێ%,REkS0ٽx 9$5}$#;$Q+3gpsnT2$v3bU @n?pv=E_\y {bVoZ60p%egqHNGŚ5iBk0hEhGqGr^rz^g59D- :FMI։~\8e( X"j6AYX3=Hƞ@o' -Y;$$- Ԫe` N2 ,[I+H^'_w2|gݪy:'_Ww>}afNjDfNc XL8Hsޠ qw5t3C&k<^I"n2ģrϓ::}gmG 3KrrD]YY|~gJb6ech'L%u85;t@"e?gI8`d$$#spH1{ u_6 $!y޺ uKw&dK+<" X9pH eƉHHG{UO$X?90!?IGsWWsGRU{1w6p"#JPhWc{'MڜG?hm&DqŲH N q#AkC8RN*(v Q0gĄz!2w ΍A$7C%G)6(3a^:[cw>.ХueH芸R+PdsVMig@'*x400R0Gr/c>4 S0HT;⭛<3o? ``Ǚ-mz _gۖz;a*IIVCBcSKNqزwY)VV}sDJW@9f $"i s'"T^N`ѡpoܾsךp$ :zLpjH o r˪i0K%آel~?ҕ@eh$y睪+]@, W 2$J)N9$1Kd#$N+HG:]=cJ+u|#Uk@c4OU3>>U Cꪆ baOڻ֗|O I$X 0$?6C7ORD ˙e͡CAo*$7ҎK )> O2X=TBGNDx#sHD@?@?`?Hwśr_3PCGM$-kb)   q `Q*...Q.+Veeb6N ѳ1I*vqAѐ%bu* UU;MD>HC]gtz}Gty'0a {fOJ3pH\5*;PyW @SC]ڭ!r]ʫV|It$DT? d +b*p0ڷr[Y$2H$ nX{=G wA{^1{"5Eէ,(UGSӳjGm>Yh٢ RwDQx!!1+©޽PI.γn;Rv:$5I8cH$CHVA᷺;ADDD] hG1oĐTF A6HU-$oVR.O!D\>ePǍ'Rz(X$2oѕk!o7ԩM N m!ĞW+/2#qccg} =XD՛|MU/d3.0 3y@dadT,ca 5i9?nH gN̨A$z4}\,5.#M5NTLq#h͚Uo m 1oǏw%_m3瀜IDHb+X^lsfb`0!cgtyC:g!#Umҝ%mH s.O%yy.Z/kbi{n.)EB\Iy=YW$Jw`K$xnUH.!'b-B844}\f}qxdl{$F41#zu'Y$"HjiOOݴ뻟@J̚{J6tud^R_΀|馶֤\G[ H׭D@m8$ _V 5g }^7ѯotvoGmݽ{+6le76\aI]|i#zlŰa{fl& ϽHQj'klƍpcc(w `P.0:6I'2%,5 ڵyv4a88åQy$h{uu=giv&=|9u63"0oDHG4QjMhNT;` !EBwH ^l4QJ4 $ <@-ԨZwG+7MBʼny^PQ^k=0߿qcfP$dKg(.8iC H1H$x"suk4$tGP!'`HݜDHT`osvɧ!+'"Kkn9]UeOC;Qy$QSUnGb'uRZ1m8Ҵz F-F &Mrv2rcԩ<\z lD.,eV G'J?RHgs#'/}1:NX./[`1HIxKBW@[s>W <*;J8L)qr{,Av:͓q0 A9N8|/5@9,gt,ޜus~C)Hָj' .:@)Vgp Z stTA sGl#9$ $unyځ)H3sKlSHfXT@"*W?JRǭ8]CH lW]J'Z F~/tNfrHfwmmj{/.Et[ XA@zuHZCHX~ #$%~;& l,,_n{ ]k]T9v=gƉb`HPKsRX-9SH HHgRΪ5zO(_bm܀oN}DR%`ģFxMmx&֔<O/nWL cԛH5鐄AUqA*@,&8^}Ӌp/E @S(j*\4?J$$BSTؽ=0A#<wǪWN?}do!چ2CBO-|0v D <^e2n/.>CYTF6H~! ByT9`b݁8{ Yt.NH# 99$p ,BǤ]G>_黹?QDL2;$H4k{) \GHTe|(!d`$ OCpd,30AHBZjin4C\HA%[tHffw7`uxT)JdFi`^$>Z;oI/\T鎰E_[60.)e\q1$$XWӠ͚)c8 4=OGy H=BYGzaDDr|_MlY&ұMw\ܾdOHjEI)4Q>۟v/SۦeA`QޠD*(QS,.h!/v2_qMNeW$4k`Mp Eze2Hb"鵵HzQc`UP!a5xW܍#w]c`ß4)Gm;Qg,(qu"P 6(X nI H4񊆠.p!.HG6,j%3>F@@ 8"!(TƜ>i7uGhN@GTeRU,EC06j3i1 $QQf )f\+G/s5c#ܫsq QU5nsHcp>'B̝T$4GzjSU=G@wi(-!nE½I6L( ]wݻgUAR`؄EPć%GW~ ק+{}TO@M)% * H2k,S(sji!z oP<fmg0̆$ {'! ͌[?9 K M-'%*,% )t 5 G-oD' @)1:E:}H>$%'/x޵eB!bPh='"%;/<) yu] x4JG:^r1^#ϰ,HI]2-ՄF@!w;Z܂Fj .c|RQ-.-pJHdD5 ?e| R HARlRR/v4Qɤ]qvEmZxNԡHv>b5$Vn4H-t}=i@2ΤHNqJ73G.Peg QYsHbqtk#-ۋE@:٢YJZHOQI[B97c9FPJ^ Kok+#Rw&:0RENy) 7U!0b! uf빹teJWn=R^jtV:9ݫN]O` L9hh0]G6ofU8e,!L$h)PTM(>͕;T}y5dNMRfՄ$<5rK"MY& i@}%#RKiA3mPg>6@ E-E TTh3 =O^9$mtTh@qd:1 t|Mo9 =eQZxD@+bQIpQ?}ͺ^@}={$$C$ @BrqupH*eG*iE=q)ZL*@]'!S9$kHqIٱ%ɠsvQzH3#]u@ҧݴ TW/惘p޴) |*e7ea0@h/T"OŠf ]jfwA}z:6tKL'L@Ro t?Tͷd\ !b7{:@2qm.3v$)a$ k)JHHˆorHYh= ;l?ۭ@*.))fMpo5;]i% M7F17P׷Es(0X,C ]c<*!0T\ʯy/oե._kF6:F瑪@*Õ$7 );%eRr(x"ҐHZv͓[Q @ze&5H6=b%e7ϩܻ.-*&.V@º"@P8T|( Ӈww- y/B U HS;:CGGWVӐёdm@CuuHYD]HV vHHiw  !g: " )B0t);BHMB+ ŀE%}j3{2])(J-] $[F3Js9$*@fT;M.W}㦱])Hp4 ۠\/C"a =G fVE!\lHx´q# u,@#e瘕fjϳv zo1p2L/#kwHRRƀDJn@HϋM&;5 @Aw?C utH9E鐚dws-q!A$F0I/0KH?1dʕ< kHGφ~|opRu۴ZM9CZ16 x40 Ӫ# ־SIdt27 )UȊ (B$&3Zbq6wת$*j 5FH{R/rbSqć5Xcm"J5TUԥDZ& 8_~ن&$5~:$T,=qDMHa,iV!!Q]ڋSŶ0"K e76ui~Qĕ"L;'\XoؾHaC+2CmA;/ʾUoEVZG#6qr>1.m&(N/۠ΠKCҳ(H9L*QSU5[ʅg˾=6벐5)P䉄qHݱүCEF@lW[>t D@.rҒ¤QyXEem\=%ݵ\n#R2v]sRRQ_%%%CsRR3T7X$h~4OC2..enUC-{t vJl Ճ-=2&XƎTbE)tӡ/fE0h+Jڵڵ cƮ9cX}\88!@RvQ}y7u{EvV@ c B cyYf|ajdMtq007B(Ih*KCJKWY=~O#=#"9ms5HBCwیF##.aBrv(_ᧇgDGH}*~* $qC.w}k}iF-z a ɦU;G'9w؀IH9:Osu4}vHI0tA-`iat&T.#4iqLb1rrV3H0ֺhD|HE @b$?ʓ~ \<䐲|b$l✁SM0sM6!9s]HzLHR H mxticP`QQ wL HY sH! ԲFƆDZB$( 8!i+) %gr"}lt[oD#?('aWs o{ښzV\$^C)N6);jc%:]" Tak+)Z'1Jl+kUtso #[T eujB@`%q ̱Z%HE ^h{-o$%H2j)+3ՔO&>WzOeekjOmRu$T}KJQsUO{8@&v!,֧AM$3*lȆUQ#=檪yo8m5WݕmT0hCH)R.Sv!>NQzܑD=KC1wt޹f h]D^lƺ 1멨; UT`%v+֥BԟrkW:m_ZMQg+[ZJ tRf?3A_N9"ĊuXm$|xz!MV `XlX|HN z .C.MFHA^7zڰ[E &S ?HF#4X;F p^ئvFk'#d5/HCJIT5aCjC!߁m;bi]2=X _ߒ@叟`QIv'L#);3DqG3S1 }$dKxTSےTcsg17[ف:}}+dn9vYqk2))b&'A"p a p΋JC{ҋ:A^-$&tg@E:LWEԮҮxs9]!!*–-jM}c X`s5l]@1£{K줧,A֭'nB-;W𭁄#&$4B ẐG?Uy4(zHr(w_DAWPOo?,R)+:]; KgM׍0D;sЧ*-<6 Hݍ;RHsG;]vm{U]$NY|`@jN+7OLjѷ#!ݲֽCxTRr'GH;Rm_Rt ѯUّH 2ӈmi$ 3] #CC iGi"٦>Kt*HSN?nnH^vDJ*;1QJ %2!\nu˭Vse[^ !1[aBR=a)Eųy&@ZL֞eMÞ8c9K %\w/{@y=U)g9E AהL״O1 Fj)Ciz>TE; dС'|΃uc) 'B3Awc oϣѫҜ3j"1H7%K\ ki|lM9Hvz9=($_#لBu0^$zoǾ)"C"aA"yem7ZZR[Q™X0 Zb٭ v$ "3o}XQ=1 }?59ePYWziy &C M)j*Ǵ zzG@b)+FwN>'$H+p]4mgfͅ:ܶ#F򗌟6&Qe$Hқ(М50nuኃKuUEX ;+DqG dki:dG Q H.4TMCGXB(aiW8o^@&wsQ@yn.I,NiCvQq-͙C$Ѥ ^rϢTsD^nډ;hv% x*^H]#fi)C:XH+s[* B7D>;2\By`@b@H~y|bh}<.xRX,}#Ѐ6<? H^)e,H}1co3sǏ30RH&Kٺԓ a"6 }6s("@pE&#^[mqluR0QOKt{c H W JfC|Y5uP$g BMG&K HyBAwv!qâc-+IXd@oCH_rAfx{Eȶt~1,UR!yNrH#*5hϧth;@z/[By_ RNR@ ܓxKӬv 2QRQV*fSH/)ЮԺE;I^!R+X4h@4b jᑶv8/k/aG 9vB4G#\w&,Gmxyy}pЫxTHY+8yHmuթƖۺ?j"j$gV,ިA۶}CHU7WGaR 0m" Hm<""0g<Ģ'ii eIU4${HOW3$Ht G#iܝi 5ZsK-/-Ԕ\C/b NrHW$ɢD"i Q;+j 8 HnQZ3śi NO9n;2(Y (\LE; TE;J۵JکZGrʳkl>JkuڎhggomEZ).zWk]xy +44npR!DO>o l֫ih_U!qV.HdG# ^"I4S>ɣ8[hb o{,leZ^'Ih[xD MP̸/fT-=,~jd 吤*ŖAI@z2"8@>NE6dy6FcI!M9xs <$^'Ek"trQ+aЊ@EJ.jРhG :HOd4wH4To% S{ jamEp_}9=a);ku\7ʾX ReX-]R2v,AM;6&ݱ.dz\H._5Cb?bZZ¹%aDKĦx{=_R݄J}]5 $}Wu&™{cD(Qvٗ0}$O(M&Ҭi<"g vwN&:iZF:9\$dci?vT1 ee2}RG%!"t[($aC.g iP`1-$r|^ϒAX?eA+e~ LYPc>@`)p ;'XӚRq}DE ,fl޼1+Z|E (,ł& !3GaQx{0ԑk֬F5/ &$s(%ʚEgu *gꠛ !foȭ?}^sm. =H-7ˎB2'dAŸ6DC~L+$v=_ig?DKS5a04Ś,Bp+D` zְK#>H8RdOBfQFJ tHJmZv&I)cHIEc%1vr\R:mdk jwҺok:3f!H̏sD>t坣0CБ([UFiMC _67oG F J(!ծM }#"EPu Fs]Jڝ$+.K!5(:|񍁒̢xɷ GB$x4爄MFp!{Xq C`RP<-(d@j Ad#I{mZ[JȮ]۶BڵG:&nK1{w܍q"ټbE3su..uAF``XAHd2iVDebxG< 04g?˂ŲGU]vt˪AtRy-D -l-~X kIvz0 SҌ>c QVgC9xN>{&;L?e%pRmurM|ي\T;eȵK4=~j߽{đpɓdTs8bu@Gm iLSHeEiD⹪"C0@ BRr&yMH/F+$TA_F6N\;|y|^;3xĵ:ۭY7t3v٣NֈNI!5qkKo@*t $K`E&ʋi]Q0 a=iS 2}TQ<їZo jXFQe}ޯLXi#$ɎALtrHH@4/Fuel&wp-0_Bb5JB 큮dLY9hիWA8[FL^Á!ƾ@}RX@8M9I"tNrcVs2-89 q3⢭qPP %g2 ,MC˴͙,-v0AY PF- 7EĦ&igҴy/n#t}9|}^H7#(k,@-43|Ν{/dC_/>5wۯe≎B:+%y;: P$SatI 9~i, $WyA"7@(1܀MCƔ˗#gPDJUODPw>;-[=K;*Mt? Ύ.AvƢyFwHтR E/1i>u:Dz,-*3?j}/*c!moh3F!rʱi_{oWB&xD{oWoȍKi-7`# l3,6`LZyu+r?oVHo@Jul2R)0ˇ~V| FIAen!t[ٕq^=[n䮴7oJ E3bt)2P6Yr*ФԵ<H#;5;m j6? )H<*=zݻwg;@# &p :]QդtcZ<ch $f{b鵇r7of"/GxH#7/O3Ys)u[~/(+W)tqO_Dg t0@w\Frw4OA|E^ B,ɝSGwy5sHui2T%Z)C }mRā&a[9sM!CJb؁GKA˃OOT~P >m ৬¯x"=pI IgjDƈ=b; m .)=7|J׾v‘`&HPh+3!"_XǑ/ߪT.9@.sRđ>qfNuJUJM)Cb&R観N#?lX(!+g#ȦX]e-VJ4SНd]CcMs`1H%icK FS;_ۦk"8}/N8w# ]=Zm"Uq܎项;V 3pD9RreBQ=( ݅ns0}3[qΝ-$4糇8LXv$!aW׎,K %a ⎀DۙI!T %fJ9"-vi C Kڧ[D~GU у[h=t<;[@$S_0T߮ \b (&$%K* ZcFm`T͞~yh1 &QDYȬ~1o_ogG~ooX(V|}UOOg=L!aBG<)`X3@LYթϹ1WD+#Gc๨!z7"C:β{wHQ)>9} C1ziݞʥڰ`c Vj#I H~K(6,dgwZo͌[;-['s,q)Yovm]R2Af|-ޚ a)z` aΐnZOƨ[MWśySmN/@&I"9^^Iwc\8j ՝{SF.hhF0MSNIB11(hxꅧw A'&Fx}JqtpZt2HD#t4YqB+|n HF';_V:OfmrUdsX`8)~LrGgpRdQ%cb$đEpǫow- R$Y{WzKE ѯPSU7h=Y˘N${hl!.%w%ZCv42BDf k5Bw);|@[dZu~ EY &`~ 7P_ɣf+*;ߕG*-f>}}S33I7:'ÔZ}0%gͶ aj%}X^3 RW'4#\Czk ,a;t/_4to޺sK.a"4^B*)R Ke~> $^ܮ]".gaMYYk)pHRNV"zHON%r4UJu5Q$ᾣ^uubq7="G2q*6b4O:BCay[7>0б$:,Q~Ib4IiaS )SHZ1s<ɐSf蠝`S1`$k"ti$ceGBMbs2V=}hY M Bj]=YS_WSz0[C8"kvBg ;^}ɂ;KwQ!xWդj:]ϰh9dӐ&[9xki-n<먴3xR Q@"8d_ 1סдW!4dE. %̣P@p@ۍK- ҄ r,ktG 5N$חzn0'.٨`]Ծ$˼$:r'(zKKbjHM [ eo$>Rݯa3 G`$TApD`wx4Q@Uy"bvJE$)FJ}2HH\^)2I\cpHFL@"ݡ3a $Ejaʲ>{CuWW:p݂}N8$#$-YTRS{Ky"='xG<5mG'b-Phz =dǪCvl5Bc/t H"mEQRBY`6g]K?;CChU Q!@R{ ktzc*bm mYO{}hVЛooC][>*)(@mDS$ZbξE:i+k!/VBZZ#(O=p Y$D@r4"\Gqp =J'.b-'c,P@v#vH j"A )HF޵k ,uv"!RlI wEI$\aFv┺*\iUGDr90JG!Yw$ lNJ!ET#|?~`x lGRE5\jNp HIP3$T%RE,ZHx C|(7 $ =ԏ# >Wݯqx'3: @2⪫|U#I:rBr?+)#IbjaГJn@8#BfDq,(cD<с;IrH\WWec tbx.2a;$RawW A1Go!"o&n2o:w&#}9+4񽷷:}4?6.KrzUPKwdzH*e[hѧyTgP|CZI҂;:b ae Svj?Oa&mM}lhQ~Ma1XHUz=4&?lf8FΔRm~hc@2&EEʹZOh;֧b Z< >`5L3xUIQPޘcvG<dAj$I` <cT"d7/fի+OCmҞ9@\x&ɚfmTbAD.@>ma@⟩8X٨֚[WŘb[-sn)WoM7}iO-;ȱXw!w)!Y/kyoތϏys\sFv 7@`IZdA- gk־q7l0:0@&i l5 "Q:I|(HaiH/@n iрdK [)[. K}2R @J KL4u(=v$Eaj6{xCI{I#-Go)v SQxZɼЭ|3 &8!6WjO'iO\2W)r&l"݌]ZY-R7$O\k1?G֊Q;J)~=n~"9yS 5Jݭ5ʂ@H q`9|o׻{[{ {ioE .mT@cXK&8Ff}#(%YL;jK D-n}Tc =N(SR%Jn( #P36% c!=k '">Y"iDPyyģVAU*>WgL=b WEʮHAv;$"eMrZk9xO\E{K\ogɥJA%M$4m5r=pd!IG$$G.9tCC'>*;t̮"ƯdA# % O[v鰯}uZvM#\f u[4ib:)w,EGju=ҫXnPJ%|:7@ Eh \E[G;v ӂ'~K- imSFqQhb AɚHVW|%oHs[Zu@b&R:.4H"G/NW@ԩWnº]FQڅa,7A;Kzbf!aK>8%H&$䐞 9 "!*d-zt mrR[m!Ѝ/!\5QYC\[1)Ti*Z~XۛE! j# y(^^pG"MB#FDϨt*ϯug2ʣe $4UW]Awx^zHH) %mmwL%.4qHL!itNnp>^l}u_U Qwnˍ G`OIxK0 A8( <Ӑ|G-6)ٔe. P=AN) ;;E.@:|4R4 CU}25 D1[|? eVi y^9וӸH!B#"o|pca tPCjlôuĞtbex8 $h*5Duy$[}.Сa2}zaQVA" T WdK ?J@.GM%&uV@L5~E@%#xcEYnTI&ģHI|;syD!;B5@3t '>`C"Bz q )k *;W"U"R]TYUSW)lR 0E> IuP=rlGZ%Rh孢 5#Im5KhdMho0;=<"D퓪޽W_ Hsi@G`ZID3{N'] 0 W6LaA,bƬ#a"9$TuGxm9͛U7}@ $@H$38\SHs@c_w/0Kz &9RÔJvw8!;{_=<0.K%&YBvF%R-MC]u%g4?W9:dwXIwJm! #v d0=EbRsKK/R춆0H.4YTr@W9/*'5p**+̞J˴C^ {)[%V iU.@:MmZ8s+)XQ!kC^K[M$փeҸQDtn+! } 4"@01hEM?owBqOZi$g $}J;E,.4/I& %󂏀|/hLȜ!Bt(Fe߳('Cx[$G<(Jz7U.P@>1HXV Y@IH҇`? $9"H8Xez-TVs4ku7Z;H؅IŒU䖒. ҵX+"tD2H0Gw#Ο?x9vCue".w/WNtP^[2 yT$!5⍫Cbe!N3 #lx*$)Ƀ\͛ģ@vHAI E9t3JM:fc"u9G@8u1x;Dw}JERS_{xXav,EJo^4Sf$ x̼4a$%zp^P}h?~]FXF&]Y"bs;ł|<4N w޿~;8o_Q;+~Z[H RHg'W؊0CYsСLK+\lΖ!do?qpn*Wo_nA}qMFOFrC.?I9i8t_FG62WPwHW_W .Yݿs-<*:H .RhO3f̣Őơ7t(=),@ bJeyLSEk@by6MˢH~*׏yԺ#g!4t uK"ᘎxXeN7os@ 4ii$A~5[aZЅ{A:~`*>8T9ka;.╖Hи #S 铟fݗ&"M'?!!\,DDr搞v܋~`_ ]D Jf _]z<46e S+ONENnI8jZB~SLPKaUZXM3A"O<e 5U o_6>f;o*tם{qMԇYqc4@x^iF`8 䒢g t ~媺dF6$4NJ?MG[@4H@4X* ta8VJB}E|" v+w$"yhA$M"g*O5ix$ }r$""q7~YHoT:|Y&y;zЛyAQ|,4òxk&'F_4-gŢ7pD1< j2H[K|A2SAO;MqHq@!H}<_Rp[}W"x 8t)#!.Ǫ')ws}Kw ltcÖZD^L8RIdu22B0!H!"\HtƤN$J3RL+9sr3s෰ /2w։Uiޯp C@SaEp U=>])x u1ޭ3[ln;[т#4,t䎽H-+մ86 IʺOӧo/wU $.U+WqH idib6Jd-8|>1CHi8 '<ȴGSD^3 -="n،zir)Xɽ OIq&"ew-K qщpZWP%d% XadwHiN%F+%ca.-*'gH;(XU3;yd@D9Z {fQ|Oi5 |-W4a."pc=n@,pTD7j$t9]=h4:Ɍ;$X Xrri"# ZBʔGo5G4M,6ʁٌ%tG_4emQBڢ{ $fkcą[ U[&ځHT`SyMcH$L3JOl 'JՎ $Ϥ{Q؆(g*ۚ^1XyFxMI ۝Fꛁi$A2S}Յ ?p^97\EH :j|,j0|'V. $~ԘG^l.GOf,'uIѭj AǬ)b)s 1DAv!\ <&ҘxӪ,?aNҒ+-KD./ol`$R hSu2a@k!4>kШ T9\uyM#A[s:XG\K3bl"}L$k !u$CviDIB3Xd?N~̙{U?ǍlígܚzɓksUH{kK_uFMDU?O 9)tx$t?P-y.&keqS|9 tYM\o2233VSu]i6 C5pd́H!fl]߹vqGhقHg&NI嚪Uq76<#ȔS35|Uͣis.vuWMR@RSg^GMlc!AbEo2F[IriB5GN; M E?-u^\%$3H:1ryP1:켲KpLrxo Q+Ͽa߈( .:#cRVOr OGwzI$5+0D)[{bڢ6nѿTGZjфuSڶvCHulRU,EѲ4%mǙđa]HU(ii$'f*IQN^8um_eh\~2BDɠX$?Jw22 $&7'G" !l'+H IWمem_ijʼŔȹ rHA`σV0HC/ZWu=k,@BD̂'//,X$8jo,G#TT}E;̋ -DGģ^ SΌ5 MoҦל;"U&r rÒ^x$&<^摼u!?,pC2)$$w{$ ֪%{l7hmщh4856q "ёy4fXPPbDd)M@ @(N(p@8Ģ&&q1KJD7 , @ 7Q rH>7Yy26i|f5}Y HDv iͽSHR@W~\\t6u>:qwH"e11TQJ;HM-4o3 FZRҵ~$z #TBΘMCOsSbP5jtS%sa&V?GN9Ef88V}8"픇Cv.nz>(sEh{Xv, .e jq$ Ib$#{gJ*C fI)uJ9=btm+ l^ؤ)vD5p(7܇GOT#cN~?#Dw7iݽJ 9'b-Z7UFd{Q[`u! T ɨX$X9=Gf#HcvqPO\դ m $<@I@@6؉4!0g>sB ۝Jm@H2p۴ \w PGف4mÔB2]`L@r/2C0Db %A \DeCFm,.,!aV]Yώm`4h3)b'BȮ= wdlZ(227=L$vHe%A([\qu}Hq+.M؂vT+ EbAb v) q!tJ&)$A% gKc.scCG}ŁR\Pu x]|;y<]C `V.HFHOtQqymҤsU; ߑ[dwLavKABq^vz ^“ϟ$\5\[[, ]9+HI; O c 1Z{dUə@r_Y,4v- -8_EsiᭈeʘBЍRn iۤ\h+Z=tpO^*-:'Hlri49$摋 DT#ģG&)(VsMN0BDڣi-[t#ό:nM8iH"|$k!͘/jF;"V'+܊6 % Ň܇= b#Xh4og nţYDz61͉Hĕ0VB$l85А[gP>ba> G8WH<ʕ+WPa9Rb摓Gr$~\Gc 1Z[$jAZ_v4$۾ӭ8(t HA c 23}Bd"ݚt85[4B@&==^>xWn+j4:[HV+1ԓKlwb_7~|]KcbQ?.\1x}>^H#}$׌F3DA]#[$E5 5-[A2"SE˻|Om?uxc.'d"BvtQA\W^Fe!V- UȝGu m Hf,ѼE&hmjйQHu/x!^'v}˛H< zeE(r[E~q(zr LDsхU|Ė\7 N"4z8Ewh`' XA^ZH̟UBQZ' $2G5tˆEO,7 y`&$hG!Qŗ(Abk#6R8Z*2y(le2XM H ${zz LBɻ{o|^QÄ#>TiH4˾u+4pK(drDBA m챔N|a2  Ǣ|?7JVh#H 1nGK8{)Of7נ΅P˰mcpx>5)P8bSTTTr/#.,pčݙVJ#(H3!k2;4kx 9Y$b)! 8rr'>7MIw/!%':ГSZ*ha*6*a D@ 9Tu+>HK3J怜ZI}ؗ0+<4&)MqEDt抁jn;nMc`y6q6 H.o9w 14OȧJTnnS^䅒o?xpdLoY`y$GAN <ԿZK 'jV +?\G}Qr[[q>Rf2+*JC@ $ϳ|$^(?!7>rGgM1; $'7%[o`ym={+]2_s&O纺?xF b[[vyixq42x )={:8?rvS1SQCN/9gi"<ԳipH,@ BEQoAq.īI;ޟ~~OY3w+>^|>7!g~04oL[v#(c5^'׋۫?vT.ܕ#s$oBsjuh 8m׾'EƢ @1")4gVTnMH+ޙI O $#jB[WF?alɋX``Eۛ+4G.aW?"O~1a &?N y9:R+7&J#9*7l M#nU|ٮL,,xu5UL4;ޔ)TK $ IeDlw'.x씱hӒ~Vq7,@ $W 6,XX?ײSq _%).ɶuvWVyRٺ )hTԑ3q qSBcHlkgm"]m.CUZߜ"5 ! 9nbGzB yVSԞ+=gDCڕ'włAgd35B^AT;m !1˾LӎFH]ic|G5^3#-)c"G6Z~=Jn]RK%ɥnn<$.`R13vC#TpUӕP$wjS-(}**!m~-[r<vE$&rbCG*7 "|i[Vm$\b[oԡL#!}2lb${m(#|2G 5|]$5y,u%ߪbGq#cE_u۷oNGZn[9bc@zE5D`BCb es"QFccizb{?6I*>L7'Zb~vBr W6 HZEQ.mTzC8%cKv"#$gϾ)zyʬ--VCvU&P4YZ$9i; Ч-a-:6G>K*͌BD,3Ϯj.yAu$ 2 QǺ:,"]Mgխ_hŵwn5r!x$tڬPGY ;>ΰ!a@VۂcbdɵsE<}9mIv?{ebq{05KCFUvG3H-S ĉw& k Æ^M^wmA=@ ]75e7w=X:PGһ6"_~a%$cwL*%[!^G7,II&x5! n$lH~.zmP:7 PBgx *q\CXI(  |9$adliN F6AH# A|gTG_.VȪguG՞O#J?{@~Qfy@YxbkL0R٬*HiHAHzV%;e HJ.RH|&,0q,TSZT0+LѺS#ΟbLy#:;;GkqњJaj'%ZsڢGZd4 $i#R("H1;܀4@gc-,NjF;,T[>`G* X)[d&CH:oH101))#w\)2i(FOGq#w{m$ ɫ{gH\Yvg(XZ҆v[b$WMX [9n&&sm1muFKl JOa0VTgR@ $xE9@m@tY@ez=I+#%IKVH)Vwߒ0<[o9*X09]I T|>aS+zDNGo~S/~綾ـbV\$L˅E22$ }㯧1u:J K;94АL,~ms{sTwgB@2JlBܾewN1DQl`kżywe$E>]#ZF(c!1|k\@"S<Ӄ9Y) KReIIfgdIH>OyeGש$RN%阝wJ1 ]`{VIn Q=ֈRF)3q`\j2jv24ҍe`DCؽ}aX/G\;*.O˙5riL ,hy ,W5$%H+ȧOtZuhm]Voc.?k~B听;#\5w{Mɀ,9XҞ=dU3xuI ߆KQ& 71-5?c|%R'Pٌ7pՕθ l>a6p%$X ,q~& \B5; %[( O:0]̡i$ =So]+{>` $Y?;( P ~J`&1T, dE99hEamΝŻEicѿ* FAG˙A;$,|~N@¾ E+sGa.@rroqkʢ[5ى1HDr5"Kn8$tHu >79T(xzM8$Qf'UTZ8@ZMn]]՟W. $HlH~≿]F<:8@?:_}o'.^. 0I+(TU|%8_/\NWHՀITvr[j+|vkLX#J"i yXe8]H˼-`K<)[EX"[6A"} %Q I$6H82/]{5 'D*u1i=gT듗xW{Ď AG%T)D#zϗDڗ2behh(ixae%$=ts]$vTWѕ $ȯqْfXϋro.z<ss-~wt(xpud%ŚzxokS[_c]!*[3Y!rRWL9i aD;Ciy#2He]J:[ t ]i/ T˾;9T|Š>k-+͢…#FPѣ'"rQԐ#<践 Lˁ$Fsd= Z;C?x6qdc{c-EE푭#'6^߮c5pHkd{QQ˱cBd;{_',(# 9޹"C8* e u|4$=-$4Ar#$>Lګ>*w, >}rx=UDUP랭Fhb4a vq f Q:Si&R#餐$$pFL%5 $cA_I!drȍy%YEԎ 2 !) DpLQշH*ƫ[ /#rIHru7T:5_=(Y8BR&Rl1P4s?$+yҤ供QC3gv cF TCq:W' $隆nĐn\߀~#_]d-Lt}xfytHXlJ _bgV:d7kY[=V$ːlʑ8U"uJ+/~;'v QU+W<;NΚuLǣ@ 8JMBKBL4_i}᡼[L3#-lS<-)$>D@wino9pN(V2gAm^IXQ{@j5\bbH Hر9dH1D ʒ:~, )^6HqCLy{gCY$C@Z\ };[ FJXe@Nu7H3ddv'O^p].=ԃ|J3CeB:) yGzxFJ@CE$#)MD!Vܬ;!ԝXADbr+Q &PmJQ?w!*Wb!"2Gmm3 $ %H R9{| !|ں '^}+""-y F!<:pH >))#oKqMC =LriT ${/J>WG6H4e2|KldqKOw<xP77$Y4D`h?Mht3dbM8V2|Mb ߶;bU*^@"E@bi\V/ #E#2Đ;#I[4{$Ht[xܲIzvo{g> MwRL5#zU=Zo$o0vT+4ۊ > ֣3 Iu7[]H2H4*d{N$hWɼIpH5Xz \cvD%)Q5,<'tW) =@,QRy"D&0H6凙J;.:i!M.l!8 䐄J22(oAfC.ҵ 2,'b'G}wOq)x$}c[u%pdpr E``nD4@}ɓ@(DJڒ'KN F4wZ{.bv$;S.M>pM"yVjUNl} vZyĽu}۲h )R)$!RΖ|=KgKLUӣ6.] sWhwׇ}Bݍ#7JJRRJʠ]g!H$I"AsX,Et@a*;Re\3 2J"B">Gō~:v@jp [@G)"bI;p桛(H'iD:0i6cmnZs160[ԋԑ@M`!p}R)R}p&\l>)插ՂR%#.$5fz&I#y6ybsӌp$ΐ9[_{mlVM3G̳Y>3 DKI koj[qHU5!Tһ0z!{ޘQT0 Iok 'RiO'h7d1C(AkZ=T z{{k@b,)a[4@Ta 8:D @0H7i>jRrA"(4k:r?dqH,d9K,CүYH/\sTzUuWPM#%'0 $9b<Sbg/3Hӟ<4H3ZGGk\E ;RΓXrHF$4TZ=oDbGy-H#}BݓѾ˃9 O8 iUUՋcCI3i)"I#+?8%:ktHVrqY@"RiÏ$MlRMRP*;rMAoXqhR_aȩHN761JI#`Qj@*lK"u@NGJ0 '&v (D:js^*§$N֗HVtV7ψ,z~8Qـ$a$leP-6$I i1H]Z(F/I ēv5:ν3>;3`w^6ث0g[[ =Rd  1?V;#gKs5KFS#2Uij }-rԮ. $ ~ދJ޻ G誆#P@s"IImI ErjG2Yky}a:.5Q,kA5 +˗_={} ;έΕQ U_@p!,:k{[\cg 4q y6qfW8 :$ҘyJ߈G'#y9W'3HAC̓ U{ JvFGW>՟7΃GHH!Pg"Ux!UIHP&k)\x5нāTixXFb ,y,iqM7Xq Ǝ:AT$'\?8|2 aCɇ(H^ڡm2Chr尸}%$W}'SDmT'!=㓆Ʌ:H%'s!RgrG_ Pċ8<>$g,}F~B&zCI D#}O*E $iFv HHՈ` 9jT!ejRu$vk'$(!鬿6>rqX 6 ]><4Rz|u uտ)O7uK)fG$<6ZiR>qã#Dw4NL9dQ;w a8SPUf#E]2H H ߧ|j@қoyo敽 v7 >]Z~.dZY_[JxCQQx{]'t!;!WW(-7T\L]9$c9;ѿ' נlL#5*_Iuͷ˔#`,p\S)I4 I(n@l <寒ArȲ{(D ME<1tv ŃNIpj@"Dz54\; \`RRxWjc:$g%%G}˾D$ر^EN1;L8҈•p$K{6y;RcĒ0kt|({מ즡?ayipG!|YkI4HV* eVL@0dnX#=~ьu $%o$ vE TchyO^d4A%j"zvP;H-ݵF 3 vHcu5"_Hkf> _h3 _H;I @Ԁ:ٖD7@2a0~=]qAv¼X%BbqC~qH $h#HEoܜsՄ8k%܊%evWWׂ[H@xmuu7#8lWFѵqq->Hij.CHCoeH(e.Ue9A:󗓼F 5D$-HvVM6Oh`lxYRI7_L $#D}pʐ@җ /}jrH@le]tCⁱ6XA#ibcrq;ZrsO"N MXcWx+~O`zdu 5Imjz(h#9J>phjS4yY/ZCJ"V̑HHXuFH\ xU!]A ܡZTa"I߯W`ņ<4ĵ=ÚH YYtZ P(,⁢J}<;rRm}ޥ.OV&6E^ @TA@d)a!^ߥnPN-sΡB̳{x$cvkΊnC c;oYQTX.~oϳ9M0J;߯$.j` D,RAhmDlnU H%E>M|9PR> mh&vy{l=ַI T754R}Fzz@n@Bw $-:r;!R0M@"3鴢Q;Ϲ iV{l@gy|}H '})#:2zˣ֣1HwGwGEܡܹ 9tw%,:ŭ3Hcڱ,[QwbɫmŽP+ vyHm@Z.P-Y=|BbI D"$AH$]&G ə55TeQHܲm1}[dU]HCv10tx4Td纹j$0.\X0y R"V[5+)0OxijpH<Jďu0jOU4C*hddjj@Vv a.x=8xZ 1Aj*b户l$6'ihK Dns|{yH3$H9EEcqqcEEE(tW1[jR51I.;C:GhBCe zHD촪;[)R/K'~G% |/"Ap9ڟ׊($D- ѣc3Δ{H{ $hj( QY ͔Ѧdˆ˺}E'),Q|:&\5VN  @(ߑk  w 3rH0ꎫyB6uqOAvl$~H(.خ{>s)&UZ/.nZc"`J=IB\Q؀QF.!A#+!i2Ymzu`o7#wj`R#&mSb ) o΢wGt :;$*!mN^Yxc搪}@;%z,67T푨_0}'^EK3*C I*lv"dFިaK%`@:5bG}Vidn3dAj*t}HKܦQ3HZsiB@)cy> T7w ""1Q $,AVv7L~Iqh:} e4%ޒH]wF@zg~vfG0D)qM$h[.A=hlΚ}I!EU ɻHyC)>!2RaLڛ<DN:% 9t*j(. zQcER) I$AT~#Y£ ip߸gNkIE|uOzSOje @r~"fEP^{T/2r`,5@@( $R\4,]f ePEI6d02rAlIO7";\W@H*- ھ;AfnR#v d,5 @2)S6I0rlqD's#䎢@#YCwO}eװY& Mk>A_ᤰ*:'#}! TF!V4Q #B\/t%= ]F6hVCRX\vBH6Z@n5IMRhEDTl+ը'J+ga%)@5`J#תf'ihd{q> }U ҴQ9$dyn>*jEKzm Yf;𤮍Fcf踸ȵ懬jppLip9$Tu%T=d= RׄaH5 HtQ)BK1 7.ikzkiGf[-tN O~?bC܁3OC,Ֆ$UOse i&{aB ^F5FGy]w{)[Z"3HiV4a k%jG r#{ҍ?plba^`&E`u]١TA8k 0P*?zJʛ祔ͣ))_NVм$ τd,edQB &*Va;:#%2PpadP$Z 1VVTىu%m't>I& !)"xCf qշU #7wyCI>!; !}<XR+݁d- ҳD6DicDH6,E(M5t/Ѩ'X*t' [I=n :;:;}XgI2e A% 5 J Rm$Tl\u<3bf7U7HǀIF/q*s5 E "{Rli>Eź؉i@RIj]|/.M棒s9$k6+UTҊ7t!ȣރ{D -Dē2")i$Z3\=A*u)07[s͕'~Bf)˴CI9Inލeju:ņ8+wU I!cK` !E$Fw&\ѥ2H $bX,nf''rAr r2\Z2+L!W t+f48 /#d7ڤ4jAwH#l@"7ܿJ+4V?m\LgfE8hOGeһ_:#$Zʵm ]U4h4ruPb50$Ǜ3 ׌v%(5: įHםZ&|:+GrfvA7.834*}VnUvb^b~aW@g (Gъ7k#T9q[LHDv>5 IiR~eZ$\5Ev\do< AiO`R W !:HG٢99 t8P6A`䈝R J:PO_>!||kn| W,M.𡼌"v$}7ho*}\seM*+T :$//; H : ܱ!8,L"vqk5XL@KBE4MY> Z k"i5=暈?DMh2l 7 adS9O@a3+Ndf%?÷^=C8E4.Os(bDUW{lv@E\' g< \EDId%ns`P9'ڠdP?"ǪlZͲIoV!zBa*v"ݖ] H !p⚆Yv ([!6O`+Wk+2bփIDY7hCRIوz!OĄ5n7 b 1Ge1H+ wCr*C1.d#R"q ס+\H:jN CCԩAjYwSx͈`";$=О^H9n$Vcgg#qiB@0yd:tqOUy9(uARYeJ|{%lR':pwkebDU@})1BI"g䛫dJ.$mUv4c89h%ə2r4r/e"*r%TGxLѠ>3=PY>N!m`paR-j0HH?Dr  g7C+Dn{mY &LQΞ#\R/.$ZvIJ_"dD<HO_Zxb lӨ~!~H\r3"Q#1m4cOj n@z5[\Мc(B02+LB:(B*b Yu/V `܊&E?Bh$*!gqIW%EjjcXfdX1(@"VEdI51i5ݻ}'>o|S1ìH}OqgHqIV(1XX*a{@$aMwvsD_9&xhJS䨧b+#Lo[aR?sJse儩QydC_@cX"{dB5ߢx+020g [gNhR|FeI~.Egp֫tNʜUjma*; KYg ,%᧵Ev=00_9B9V#j*DF9n翇!#BTXG[zj3~c)OxŤ&Sĩ)S PϫYtdE &\.,^p1Sx^U+Z@eܲ4}B M|hDپ)n~x9?'6>40xJ' Sis_$U o?*?j!'񨘘Q$7;%s ٱ:@@_SṾ[sTP ?)td[QAߣ_)3_)z=_kp\3Up 4,:g|yHIQq+ SXF#LD9XFnifD}w*rydr#")d Np .*[{<CR$`/DOqv4uljP|UHZֶA?nd Z(qon D2s|6OL t]XUBBS;dP*@KyY9dw2"F~\ gxGg@gfS~p&e8!:Go`e/sm眹y?tRJN$ʉOvK#iT\fڠ4 TTW0ETݼbyʒ״zY hxc/K@3b2Bǔ|3g`X xzGݩx%>H"6i^ a%c~qP 4v-]e[zz={tq`_ qW,{*~"Enʍ$;d}':?3R{EEe~NxFBX|XBE!bBQ9g->恶_Mt{4n-]ps XoN2})4 |C9@Y(w|ُz ɷ0~{I"7V߀zd=$oxŇ<&l?鴈TmIc)kӺL{=vceX|b7O4A"w+[ni,X,뵤ħNh ;Nt>$"%HӋr< +fe.Cl$D2Rʂ⯧8|꿇92X?D"S*yLW$d^4_"i Gz$" IgT $ev^ZJC+87r%O٢irנ;rmf#NybwSlhE ڟՀ^d(=]Gg@ؽoB\LDSIy4Cx[ TqmUDR{uZ~CC~dL!\Qvn.QY^QtG&2DC}*)t̘1m D!A4Gc;<:N&G $Db 9H%gDڵfqsUVD3*@zMG;~gJxDoQB)Qe.s>#覐h4tG Ho= Բ$reZч4-'#H!SoH)VOkBg CMc"Q!n "tx1:BBZd4$)ĻZYjBoa1q y2He0ͰP7ByH˲^7_//9N5N DϞ-Dg\s(Ɋ=Rzy[8fGSH"e%oܸxEHnhZb%jX$"t x2GQJj} Q^ZL P@\:(uTJщ.() k)>h#iq&HL$Ռ@ҹ${/0ʢ[]oQ@"S7lذOmo #,PH Ze'IlܖRT/dˋ[Cی:!x6C2D@beT/"7B.Fx "` ņ@8bSCH[6 J,kX޲=(ZB`nJۑGZ&DWW@,Aᒀ#,XE SR&V6qa[S 5lP = o*!ӧOvS]'z3oJEyDqe$eqa!W$)Ah?vxRIA-ZԧfU|p {tEJIIۇ*цIYyBdA-HE#[ A&B"1ͥ @TUTD{!1c( #2@@R293CsH 1l苚Q"BIQLaH^@]=hQ@CQ@ tȎ6 -#CoZU〤AZ&r%dgHF_;~;~Ә}!8.\[{.ЮDRo5x~ȑ}=y'SXXLtlqžGq N( D2gO`E/8վ{MZFJ䀑1#{ZvL"N~@ gu( oDMOPN)7{sԹ$R~MAM"u@ Tno> QRPRjmrchqi67vua0H7SnJ!^^*Kr!TTWP\T I"u5x s@%S5CHP_)TcrHYH0/\xH8 %̡l 'V@7<$C3\ʃfIU6f E.҂H@Js!c'!֩wǎTXFᏄ Z@V Y٠/ -/H6!EHt@2"r=PG@D"D)^4b۠X:3K/05~ZPTP@Zlk'O-*!<\+-1 DR yNQx9# g]I 8jq׵xItNB飮iO%|9 #fGhfdZE'0$]:]v9(w;wc6_Bv`ٹq# 4YOZNuAZH HdF1D|SI$ $:UDP7j& _#^߅8^"|R=m'~FbqHK|@2qm)fEҪ*0i ŌV(O9-*JKN9rl5Tdir -dxg 1쀔+n!ɦj.$ * ̏~9gn޼q#"vg"Q{Z6NMb#e׺R[0HHy(Kx^xHw tmGCtvڇNeg.K/I&ȋH6/8ޠvDwoՕ<A 'k4,ql"P QS nۿD8!A=7HNU5\6˞tFH>/SOpDΨ!؇] nV'*4HTeR RP\pڵشQ\UcG_~l>jaW~~I@=%$$3H&Re k iE2&FmhH*Rݯu: x!TtAlvFYp$ ]]*2?$ٻhӇUophI}!7VHPUq\b\aӸո8cqA-mljKe=nVmo:bб[QVL)&Kn]#^HxC $LɛsP.'m"?B)^hS׃vϸ^4Q"aOHJ2׭NNA8$c8H14E^<:1e!chH_XYZC.c (Vw&AcmIՑ99XN"РCv C >P; ^ҽ $+l)_K/&n8;^}cH`W2 Q&i9ιmm $4&sI)2H;Vo?@db(bg )X1;E\zt0/ (dkJpE:QDxԝ? @H*(W/u $Z4v8"v4%:)i4$HVHT4Щ ِ3÷XH-7obkKg< K DiX$\Xuɪ:^l=A? xJVD$G}f@>-DԒQegPoTdB岚 )-eĦJ]6aHMMZ4!."lB\XlDDq_ |;hwEF)(/'TMJ%[  $c-4 ]̾s߆ v!;w=bT\U4R@!SI&@tC&|G8" I$)%'$$jԁtrI@^"Q. O} C '~V=(kfpc&('ArJyUPSLMJҴ ?DI-y1Cfvm?YC%2$BkWwKuNmӰlS!)@@K )bv^@LPt?-#Դ($/I F C:iR,_jQoNk'M $ )*6~@5*exQ#x5ֿ66#vܾ}h*n ٙx@29px(o ԅ<@rye UGǝV xƅF:uqY|{g.t<.8:[q3izjƺLyj]F8<&"vq0H͕v@ʇERfNl#~|ԏǦW ʼnR |{GˈH h%߿4i`!מh,/DG*'p[(VxݫwxZ8V\dv@:JA! uK=[1($H4 $퐺"LKL$wC.D'ZgDSkNA"bŧh$/D;/!Iȸ] D"y?P}=h g^̕ )M)#(c(;H9HsQѶD.Ia^,hvLMg!f@H.^ Y=!%dt)]ԎdH@2e>c ddDBzi<HuH(đ qZGM;uwVBk_ۤc O@rHOj!(c q8% k>K1g,oHLnՔ4s4 Ԙwㄺz<{PCHPiZ-&}@rP_{@:YzuG=㎽ރp?=n#K+j;? T|qT/7 ]#(\3@KH.{ A) HN6$zp [KC8dC$$摏22*I5)>#(5$Z2P),mH .CxzSQ;4H#IO5ͼ$W0W{tv?@Zl0 9\xLh LT|3'؉HZ'pZiÅ @HF>]cdjiFsdC={ )3Hz`~{̙w\6[Y$ .yM'4:z:nғ8%Tq@Sg"O+u+qqG!8 ~<@Z'HAz $" O=9\ZٸfS;YCPCvygK:XtGnw:yup! /e /9I>Qz0dsK "Er>X1KqXcW (;@Єa&HXLD@%OH klAPU&^E w~ yc}Dܡƍ;''k d#}}2;񠎁Rs c $&<` M@b9 \"&iRjtYVA,qe+ߛ[n>buzկԠ[5\5:0E&"$-,P<)8>KPV_׿eI eYW@xE"i~:u4"ONωH3Z;-j8Q\ o$ н=<¯7c3BT 6DaxӒh}1۪K 10WiFN>FQ=]~eψ1;jFJZMҥ*Z&-5< T̃/~c$R<:5HĦ{%RAF{L0 K^"}3}>zQLo_ 6sMKe! 3HFgЭԩ3!yj ]@h*#\ *a،+rwioQ[ww6y $VubѕU[WCBñcg$;Q8|J ~UrLiرcE 'xJR̻H̐3eK\-v'17)^gy%FS/L#hYM|$r72Ii"C7z[w}gcg̨\ِjkcv8$d$>x,:SBruqqurBh"Ias9-H5j˫IfQw5=^;$&ҥ*6TǪMV@I*匴\]55-;zDzsϝ ]SLD1;7ѰU.\ȴCj9 }sm{4xDrx!l{vVP8EH"%rfPSŸWIiVtj~htEzn~kyIct n.zjMS6B^Tk9[k]q$lӳiaӝz Lqe%tS fogN ]6sE FAwвG?x# @jJ-ķ\AW;>DR1WjR"duB`D%_tʿD=KG2P4mav $,>vkc #]3r448`1Т'H'FlĻOgG6װZt{T9f5 W{xGg~>$Om򨍗S(>RdHai5YPMZ2p ٱɑ 4RTЮ&\U2|yYN Yz9|y4˃tJ U뎪U.!,T\vx>E#^Ujn@JH/Gx I3rRƭQ@]8{#`&">:sF&lZo`}^mU $ pUc| T We@rUg ]d T3C6d$d>)ǐ@`aO߂3:wJy$B@RV $Zqfi>b :$'Mlph[ "!D171Wh4}hKAutUD9 KX(UJw80Hd"V-aUqcv+;,ͺt"QB = Pʪ)D)?OE:bbvN\A]i"~)S)>ID* 'tb_$0A S Q;x7\ ׷ah>qf+3I4h q̎qG] $VFd5d|Hsb9[˕y Ik>32ɫ>3NF6Yuu`$-=A(FH @v s变Hm.)?HOʂ@@*j*V@RP=KJuyD-kXT3)t( (˖-41)<@ڹ@K'Xk$ժS3T8W- 47Y4M߾ǫO $ҳ+(r7 EUK]48`z9"|yX<;HF&% 1B ?u8{{NON*k)9юsȮ4mH}s{ UЈ?^2.d-V0pTxbÚޒD­vބƐ t-2/>\gUeRHL@öa ?Đ(u>y,Pq[ -^(Db5TIvG ?@bI~#7?3jyDx.$J0 HdJF쀔k)234 kRKyZ$t۷aY=l2M/Y=E<#Ȭ%1 $Sn4+z:  ee(ûa7RG ](kvGs!}Uie!G3,' ܠ&4L~6 S7 F(rHs [^I6Zl+hD+ 9Txe4(iMud 0T9 %b[#CQ@QQ!(A)XTUn[ΤTyX.xf`9zLoxҟ+ !D*,k3'1z:r.H%yTbY~e8,I=a̬H>$6D ) N#zb;S-xA,R~BeJB HȇObQp8| $(BjgV >ke@J(dQuQ=sRuu.FWrX@d0T6d#7JD )vI $y$#IsINKUC!]=^o5+RXz)*?~%XH"  $uZ 6. [7 nK.ȗ"\IUG9ㄦєKvLQ)46"#D'[ߡ")Q,~S-GoA5n(hޘ|Y4GTo<Ԝ?PYiőZӲI $E=$O2CZ[,;.8Zv ${ x!驊3*^Aul(Gټ1|  /vJ2m&B=`Q)X$`$(DTfVHNy+luɦ2R}&۽rJe<'j2ĨYBQ $ȡԔny֪Vꮪ _ H1q־2YtH@BҟH:)=hu4L JU\dB iԕ5Il4<w&L)MHQX- :G}ŭOEMCϣlN$F=HBlE|+]F0W=0zZQ f i&ɐ*XԓNHJ̣@xt"am&c&=yD #e o{L[U9hnJqCH%Bl<7DPp *(*:?caR df#DŽE1E34SE7L|L{k޶R.;AEИZ`$"=$Ow 0 N/@w9j1*oyG ܀̶zhx=3]PT,5xG<" YDDCDs5ɩt^ rag4<K,ҽ#$pDJ8>n(j8A)7as4b8RnIh-9f~K7u@ lf.ӾA1j[WEޅ}p .`>w "j<c+OP ʾQ-z!SS1&ӝ9Wfa(^ F.Jd*ė@- GSe"HIT` $($#>q(`78l㐈H@-w?)H#ȷ4H"D-HF9#{ jg%؀(Ng$"=DW:!Wh j=)$-a\,#cdɪ1d0W[xa|WhʈfQG\٘<"'; #Hh"1QfgV CRKէ^ii<<]xP4`& BNW +IS=T'Hʖ?OוP-,(aǡv۴G䶒^ۑ1Ӓ< KQtu/YPnݝm[],>9 ޘݤH"嚑ĹZ$ Ght&)j)CJ>A@A \d.T|4|?Ofכz[H`|8;MGa?31QNػEZǢ#όG͑tJHNyfmjF8sp,HIf#U mvV=]6ښϖ?QH/,j5hzL_Ab(}-H%D$.@;D)1J\兒$^Cz* UC5~HC7hw|$vZ&`~lq$ʭDlGjG3i9R6W\uKytp;?Hc9|bJ@1nMp͇<|!OT2 fg,u "\S$]A.ZQ}=d_Cc `C4LRN29Dnd05x8ZY {\BH]d HWt&{d4INcnnvIHՄT^Xd5ص*|hb!t-`s. NW AYG ([ҝx;)$`$?֝$Ffة0w,r1S+r+BW0$ PV޻?46|Gy;R;&кA\(Y I0 (u%BjCiN#*gX%<H[f&.yVD;ZӨMY̡'aff*huH$GFIa4JȰS5(42SjI*7k9`zÒG9F& $‘p62snv):YeGmªȰU&UUpfJW.H~?xt]=pvκoNf(wavs8~%T_$XT+zz A?ƥ =rlGB1 v4Y-mtde)%1B:gܜɝ0d.4\iv؃Q{NS:B+6 fum-cQТSYη"S.Db@9(goG Z{˅E8z@rbq/QƢ5]H)%" l_pSHFR씸DhszjYz3ϭ]Ⱦ,ݴb ^쭫@qV>C)Hô@Ñv y޸?K7Rk&homt@-k@Xn).ɁuDt-JbgQ2ebu5ERSjOiNoW"$iL)4)Gm(f' PC3Y.Υ:ՊsAiUWFzX{3x'_." -8e{9=Ri R+*Wħmʩ fZF(nĹ-N(%ck"X3@z]춉EԵ}@JZꧩ@fbQ\HF@LCvJgs6 Sky_Bcszav1uF*#H8榹mx2(Ȱ~:g@cz鮋ϭك |Zd݌>f#P IGI{ӆ)Pxi"tG gKZݓ|P͌pc0>Av7s(UjO KYͼi߭8+O;4/:N3Z݊UGWTmܜFn)Vs:"pR2NBs rWi3p({UA@EQsόWaf[PQDHʛaQeee(qaZYG(^YحN.}<^e!d;-xT)N$6 9?',/,\s9 ȱQyOCx$WX`huM^[IjI{"rӉz#|:b)U7ܸU˓Lp$h-r Oݾ_aC=p$8CǦZ-\dqIx7O/ZǷc^ PȧOo~q\ě$?3TO6~QH\/`H ah i!eG@fv$A% :"M?),3I$Lo*}D*zjJMZDІ!ikѻf,^"ETHBm˘t:K 14`iծ[h V+19K>zO)rnWVED6ˍ Rar9)fGI:)U#BRn`ў=`r "Elt}H=H,B ?""p(8оmmsng8W&YhGc|ny1X=~R XQoGM% @B?qA$UtyLb9#Ph\GߪIG8$jƨ_ ˪>rITx~'' -}u0 w4 >sH <" d xJR5ExGÎGd> ÑyY쬫JhyfʣvA@$7Di! QI$" E+g@N䎈H9.q_b $ۭK/ñ(9ֱSDX-O8{I 6)@<)?$RRr(n7NOHZ 41/cvAGoDy+>eS{!+-nVtHU~4B CzqH@Q ^ٴn%e\{:8Paw8)2,i4@50)N%& / ΆKTMӡ` |c}}c;`^@ܣK:#'Oyo F_i&L8!|w.yǎV 吀#DM"rHJI+8d)|BffI##4&5FpFM?hSv~Y?^vU#B{Md$H4A2BL5IĮ.c39$ass;Ny1! HM*OE 9$uK*;\8+gCDp:7]#,#9UMZV8YSSss^a޽c D*#V(A'@F/u/?if%v>rkb)w&9$^ЊT#4!q& #`uW#bJk> 5pA !ofxEhx\A(TгO_Z]Z'~6Lʼn &xUHn Hobu_t6 F ):NTH 3W?8'}}Hge;N9E|a;U٣yBdK,I.Ag+No$N!ЈTOUvgb[m&:׀oє$Co:nĀcL])̩ɿ{iyCɏ%V$R$-MVDfD*E?y֑ϳ?:oUAfa :A|N&n I@""1+TWS;4x+}vr,C͈`.^W\VFgot6֡D䮽;F{dl d,}*M@HcƱ_^c \9bvWd=zSu/)JS䋏$RMUvmzǺu|׷ߐNjwYpvuDiabm҈^}2(y냃&kTyG:2@'G#XB-x#G}K\>uLa&.6ldbb7(&`!^q>79F<˦U]Sq~YEO%߉DnUvHBww*C$R`n~ ?iKݰ m%xDFk<IEnt֐%@Qԫ@:+Hhs,^߰4ŠɣneXIfYENK"i@b5q9& ős{WpenˣYA(;|-&7yj3:J#+ldFJt}5B ( xEU9wGoDRKʽsH$搨ȶ%ytQUycu+IU$ HI+&"9j5L"i ) !F2%H"8I@^)^cͻw7ZPcrǸ>mW BrT'^4AUX ;I^+5I .?Ҡ{jsd/h.azG]Y0<\'qfJ堢`TG#+O9$wdϝAS6D Eb_igO؍a7$%<`770::Ʃ@CDpH"L¢nLfH24rRF:FXdҙ0!|zA<`q!*,DI6I ? WY`"A" 1@tbdn(@Z^p!6+, 2AV@RIelN&h@UyMIH~W1IRyZ2|_9J!UlY0pTD5&5A:Y+^~;F4c*?XeGG;O :WA~7uF؁Ef<'P\:gFC_}2h\1exeX l#=~X/ c1m FzvHP"x'";<_TKxb!_G6!1Iw &Q*}.,e IU4LGTMĈ@Jw~T!rJ?␘HTe 1;B@ n7H;EsOtgrH#NJzo"Y )Q[Dz5~}Ս\L<-zjJe| R*pp߾%zP kNH%f5' /CSxM|"&%c<{)RNkbvImF^%B1G(sPTsRwP`rҫHGǽDՇQ9 @syr` !UP [/ e+xSU<[؄=Iz ʊhkC86ސٯw +0p߫!EThLX ]nYL-ݻEM )w:3 uN3w!\GA"7Xhlvi|5L.'Z`r\ m.$ 9"#wI$^N4._?\K IآC؎d}@*->JH"t "A鼀jQ=X˚He" }J HJPJPtK@U8[$DR@5i= ԃ `EG"i>TsY͛[}#vqi3;$أ]t,.*-%[2xdC>\W 6T;+ H[wnd/+IDP|=c)÷P#}$Ld63 } HQKt4 ۔R)3@2बP~Ld2N$2h|#A>xa<4bc6g<p$vћ$ pD:y@]#vlH.R%xĎ_@QI$$ifg‘K=IPVȨ @JhwW44FD:!;6vbvAs.2%&dH<ݳ[ &A=u4L,KQJi,*LQ=l""_v剤qթFW9i/ʂAs-ʙ5Zҥ>#щ.In8O@=R޽4h9DkထE Zʁ! )9+ܤ{ sޏg H@nJw5ԗG7[s2C`~ Ԫ#0$!#UP^A4v DrޛLRJtV0Qh6{2p0#rH>܅CzB]:eޕmuR\+te HN $ƐH\V|IDPHEZwHHɒF*+jDɑPsg ` v[rH $ ZxoQZ\-,(VJ _i腁LӱePUXp吆 ! p+i;GO<}5R4@bwa;{W}G ElH!h Lm~N-DBoҡZ:(@J8HE\KٗJϲ%f 2|^O@\LLcܻrLsSW#}2ZcKp=eGX$XXy&.mo;e6/ y~@jMUHp[Aʾ刜LQ2v T"vl2XF'ev8+lL yO7W$$*jǥwS:DiR۶U}TvvK I'=W:$wʉMHH5Guӥ> QklHG:0RB￵yͿ}^+d9 9ݶ<4 C8`E[,K_y? ry\Hwih&GD ]`u2oO[mDmXku"ގV*++:GVg#3Nci%]wnh>.DRc58&Vt(ۧ\h*khkg` O-$#吸DS kZOX-t.) R}#G=#5(wD7]f7N H 3$E[T/1+v/W}9.rw@BD2oph HVE@ 1jC<vt2^O1L 17;G}I0R{WnȮ_" bp}7S*qVو澺Ԩx8$h@Qöb`,n UCHc|yTKN CyCYPN(2(ES Ο"K8ڷLXv@Jvnsd Է,Rxkv 5-V4޵W^yȋs/\M^|Kl 5[DȤ '<(QrA=Hel{K)I$B?nRQ"vLSW5?'H!3 "[ Y1 b)"4B[[!&aHX2'Ν-:PvFX1|wK2jCr K%JsݠS@R,c$u<~fb$7\YCn.l` yqD0*ޏ9U? ɀA i?)J -JӔU +p5QP";!- UVA3UuU>?^呾܅Q mH$usl|tĈ;ɋ|WH& -} K HpHCNf7 ]63 X(a-"\ߣH)TdF3a/ )))W%ܡn;p`Țg~ͭ4ngW J[Uy!.0J\ >$^T s4bw?P6 $4)ARjC2%y;Sj*X@Tf{3𜅙= x%a)lǐ*颦*~ k; HAAy#]8Z\/ z/# $yU HtrH@il |&dT>y{<(ɩ8pRܨ,,m.^!1"E5 G&]> _( 6|eT\Ne y8<%q {'@*ڼy=Z|wdf%:ڢrw#: Kx4vHGPL"RxP9dYPQ l|ЋFO7Pv6{3& tA݃ k`Qk˼Z#:=&$Io g٪i>@;~0 ozkі- ]gG+ kHjJ wK6L!;2 A*IRFrjʣmHΔ ]BVvr%i;G+Ey 6o@Sz/COv̧ HEUksָs$WUjoۼ[U $SIe\ Lꔭ+x'fÒSߐp)*t1)| ([(Y)xoZr}LiAP A/J=aJ+o64Y}kþcLc~V"Hu]{5fdpOD:Nľa5UBxt@*аON˅\Na"t"<T3Y rYqX鐘 쪨!\ʾA$rʾ-h=Z@$Pbݡd~{|E4HU҈`!c*{]vAVё*l#YӍؕSXHc,[3uUi|R4I"~@z тGb風N!IseWDnj ]9{HQ's.G~ÎCmg$Rt-"XNkG9 Hsj$G?@|@r8KtHHxݲowiۯ;C% "8Rlp2x*+9Ye7_= :] vI}:|?n݁<we=J};7G$m)dUϺ|rE:Yчr2BHB!>sFGF?_n֣:b# lJ4ggOe}7&Pt]fsH@rG݀2Ay& 9;7HR+$-wj+G쐶B-[&G_ơ찳XzM~]BnޗQ:fGQ;jn|]>OjH8 qB[LTA@J k} << Q\"ҊQ@պB5rKOJQN!R>$麿dNж[).0 p aq* hL@Bvh>ᐦ+D#*DRU$GvJ( m, Y{`r(;^\Yx]B]b7mI<w>عSmRv%&diHroe7&dUDӈFYTu!(?H8MZ*$ LS5}!;{q!pZLt8RGQ|s Fb"3M援'8'e%4R= m7P0zZI3Kfcr90iun/\@"P]2iM-8&Q3dH9'4.!a\;+@-&mLX$.k<4HlFHC *~0RX$OK욢@<*ZikcŅPIc_|L|uT 2GjtSdȎJï!N'$1;L:ϝjiHA9?ZW `0:,jtPmni U"[ZZ]jR{?& l*FY*3HBvH"}b4<)Q@z}hʪN!i[S%%DIa%/SkNJyd>3aG("x0uB:\>kP϶5jw  t=T)^}iCb}d p j9x{t|t+ XV8ンt̮_pY`  Q9* g+-Gm9@):B&U/P>;$[YCR#>D[|,x`"yAtޔQl[P#ۏgό; qR 7#ՙi4`!8ol #<)$v$T0Y^o'y 9SIa}{ t $RZ:GQң/@~f_Bt䑛 &xvZB)_'Li?x6<4 ;A&pU7Jǒ@{=:^wCK2yKZHFh]x^X! F~ xCA4AAw uj%2eVadt*PL;&PI*J:\{= $D*O]pHHᐮ0e"$g [IOY-&O2 WݭR᪁@G"dBҫ={fYF$W=zumgL$hli!᎒oe^(Xj4-''ޝ#2Q<Nd0ҥKͅk- T J5`i,>BzFNolPb xӧcRkTp@r].[) }N R%*ͣX0' $kGB* #S)4/3Tsݞʦp:C+ڊ;?Dw;!ݍ') AHØ7MR,Yـ0/H uH.4E^?BI21g͵k_^h\PwpdIXh'x>g!ɹg\2Óڨǘ_w$7NfJU*:9[bu俈o{@ ᯕO@i"ye4C(O4Wp{IFwx\@JW4Y3$чu(=HvԾ1eY :c)Ĉ̉Ӳ@2I6zCb Lmwp9J04"ሢtIt I=%z|$+V 8#d8)|c~@d \*y%lZf&R{%a!фhmk64Ɓ/eQ*^@2ZRSVHv)HD ~ɳ@_g` u.x.j ,7!)( #g$/ЗJGtb3:b2ZMf}c ٯTH+H̛ewa>tO*h7<<H{gd E Jf$"yM@Bux𞮺4Tsȸp\mD[+.od^|Wc|lUSa,p)$^%I? P!Cv+u\Қ"'T&[X×cH`EҘ9<'VPcsHP_":Iҩ ;)+ft?'sH lF S/a97h-wlS J&0_H996"_Hb~lo8$ D|9;CxȏD" ˛d$-yy-U9H!M~lI~ Ͱ%m'ޙQq!Nܵ BW*XVP@WjF,UDG"+x|j*ZS-((REM4Ƙ=ٝ/ /CYv<{E7RtÈRzu)Hpm@\ gGveM Nt2Gy ed8yN)cHDHq BoHl )́6\HD"ˋnL{nҜ]{SwCt9ҁ/#E/Q4κҋ@ K4F$AO;1HGP*6vNM w<2=v P-R+ӈNCRo ¤>^EeVBʸ1>no i\\J,cobAid#4z"uKx]阈r:$.EzDݠyw.[ DB[ǞXHh̩2"L$L*sB/NհRJ0%ϟ@ݠPHtyw4x%woGG;]q-4|՗q7PaX:T|ṿEوxh6˳,M1dsT"GSNb?`Ӽ2d);4INNi0耑UVv&^>e?F: 1@zPo$.r6"Zl-($6,ACJ9 e  _IwQ ɼ.XS6vJO N$vg ~*v>|Q2Zl>v| ]Fx5,.Jxş9uAj\vѷ $6$NzoĐz sNlxOO $-7[y:(ˉd#l1- FQDOFQi c/?JKR>64'ipTQ?JH͛,kpY27Gn2 șݯR<q)čzۉL m8c/τ'ֽC2j%a EQKuG  Ikj';5읅,ʊIuPrRW ^ƷMIw=sBOԳ06lcÐ 6DKϮk!DbH`Z1xd7]Hw;9Wcao,<2\ =s9F@ff&؁]nZTG[sv5d`Zܑ>r0))(iΗF}p {y+)TsrSN!95n*a sR;XDPTҷ}f/^6=X&坥d:e Im]AƑ\OI.\(^N:7hT䆋A‰w" l*1"am ^3/$%NGaYS8iYO]|ܽdO)H?ExR5kKA\5r⎂a4@D/;q8C"dnun$-GKZ .;D@SG $!Wؐ(O` 1HhbGRm4ڶ:5_HVz6<,w'KEU<E$ɔdKmsvٱxCH+ ko _lo<*N1`8ꈎ} G !mHdk,/+RP~]7܊)7)! ,3z1<:dRV eQy/;E_ל=[p$% eZvT)=Arnd":k!QvAw_eW*.ܚ%_Y|&.ɴDƥ9k$8Ε9ۗR^v(uf/U80x1Dy@MG4zSJiM[D$FqmgfWǕ뷱.var_/ $C]tܨ?;YQ io+_|fN%NC6R΍4y:i$5;g]w+pW;|@aO:*V|s+p4⽡Aۀ6iG@m;iuٕTqSe[{C/hֲD_LRS yWum~\(ljHt9G}fsu{Oz CCbv:qkXFKNUԋH?:N=/ώ+en?K*xQP$"dS1H"g#Bmb\ z8 U>PXw܀P `\@B/DxLHFvd>50ۈJ5@Uui[Fi)q+X@r1 5zkHԈ c@IyI VA2Vڄg["QJCI %f,uPNZM)*AdW%EA>_qqeRD9 HUKUa )88yZ;}"ˆZҚ a!I,&8Yʍ*s16n,.N{$65n\JHĦ{]X$u\X  KQs% $h߯z)`Fh*5+?,7&+1?vB ̱.BciX@ RaP?NZSq7b |>I;vNPS,DR^;^(#ECRe,im;$Fyٶ2NI`U a i~SɸjŢj'p> gK ՐHz&W[X@2mͣ/jc$hyDc~5>x@rhf@AE׬d9mcG*JshĪ;ŇؤcFb@Z\` 90zS[i{<1v "d, KTAZ 1"*GrN;lݴGh):ZYz.~iwcaB߱j@zb ĘMt _,~C/UC5n{G=<g_.s7rc{·#S8z䗎q쏢(qZ.fRr֥N`z8twzLI UT@פyQY w 6XmiqJ@jRxV@$0ѰCP2H6e\\Ea# ZH.<4#O$yS c)HК$W=/.e $ eIC/ӴKj0#}HEKm@b"6)A$@"BҀ#;!p7 H[A D G4f4DgRlN|,;tK|1yk?>!^mUGCgѺ'?|h+uNw=+v,,,}B<7+H&FwS3Y8G^]:}x„z9}xӸ@z+ QtBK"Y/>4$&J;~r%hAG IQH#:v0Xy[G^* 67àoG,~*1,Ą#q:Oq8lGMjpBizAđIH}9#B~U_3)" aݺuבL Or_Gֱ_R\ǒ.͈tJXI\ն =tFǻ({Hx ${")HN㬾9괃RdH 之}+|u o\2z-HuoܝyLeyP' ʼnx̡DP1" cAXb\Sd:?D:()E8"(v^Xx xDڷooWx۾|}"RφKRm *>Th0?tSv*e@2*(BBV.4^K~jed)9DZ|?Ёҁ^#FV@L?Bg#@uWI&x h7i>$@,d6} $ XM@ HH<4͟'0mЗXQEXiHZ^'xQ(/Ddyg*1Cb<:u=ql}Ib_ÓѼyO~z ֢tc}z*hKs(KN3'>_QpHT'tn#ya+x~{zF)H iա2 _!{xg*ȄV?E#gx88:V`HGWrhk <XHxH:BᯣaZLDR@zUkRk@x0g 1& 5&T^]S815maDڹ9XXuۙH?ذ J[epD뱌[ޗH3b{YĄ7;$Rľy.'Mr=;ՖGGq,p'S_}GpocL?ZG*#Vvϛ2{H^[&ᖕ%RWZge(ߚk:aM1)&6#|\oT@,T g4X|bq݌Gh-8At G?cTHON;&evC^ iFѷdRHeI<2y tj%XZ45kR;UKj2J@/SMlɶ%Te UHj uH}&Yz_GR Mzg= *#퓕HZ%=-g{LP$shړ\xުx*o>;o(לǤ!HTĄӭ] r<`%^7r-HϗmcQLiv<8%"Hhw!g V]@]OWH:DW @$)`b]vu);wAwSv1lhkHԠdJIMQ@jMwc,`jٷm ,ٹig xX9#kxԱ=z$oL'|=z\.a.ѩd~ī"6ھ%̹.⁜F,Bpdl+M8{׌F $\oEAvD]. Ji? k_M1Hd>L=8ر#|c DIAJ]COse :>nᓲ_Ŀ}9XlHEp8@ RgpPbeC|ͣ:ºت=ctfK"R*t4^"E$ aKwqhg]HKr2}^ǘO('B?u4,$hɒsWoH}"(!o/%U=:*S$DS\~2Ef 'DR/ćHGڎOIH2pcjBk# 9ށ׉G]QZu G(u ۬ھV( eHF:B|nHgE.ʰI@ĺP "@Q$_m*iƺ>bKHp}$>\AJQEԱ0I)a#o,NɒPRe/r^*!Pf4v?h\]9f(J0-MCA 2l"2 H8` 7}(!9=tpVx1#Si ] bHr = &&׮-YG=5^f__[>NqFnjvn}2D `f/vxooz$Ək+jNS͔Q5)%f(oUS&g/& -?(4!(`'f]I"I + /|(.fN EڌZJCk>Ek"Ii"iq]vУbЧ7 ]eE HYD:P&S I\ HH|=mR'ϸǴBP$b w Ao>eBf\fkq}֡4Jf TL<ǖ>"Ҽ; '5Êv3QI8@B]x`ɓ_St@n@t|e]K"Dҍ eՃN,fS-GS;!SWo.>Z>ȖʧƦ,6<'鹷kSo Ź&w~lԈ;Y_Zq_D0h)iaz?d҅ (2o7YwᎷ;&$N5fCGZ@l<:< 3fH+&<ŸYξS^PEFi>ۯLH||p:><|I:(|3vJ_'߄\N4%MQE8 }wo@`Q?H-P)K.$ӿy꓿ylQ,UNM7ͣNǮb-v*D2 wǦ^7hE6$LE ڿ>==6b`\Fj8ZG0hiWktPU@@6)t>Ҭs45d)H إipc"@ /AUI1sVmT|vz9wASb"t4t<_gtzW"_OicPcfɽcD.T% Tmǎ UPP;XIHd6 qfdChd) ]ٹ 0J%jC$>g8K"e`+mBg\$yt9Fxf Uz)gڵqWWi (K'ob"´Y-  xL 9Nocv:ƺ.tI}ZME$o|D#|&o@gKn$խ| IS}H[(n!ܱ5h"Ke\5._jBߘ"$틖SwVw8ƞQ ohkC )nNH@([{rO[7GpzhZy))ׇ[cYL TB<<7 H+:$w %3u>ysIhN&a!#eɒHhu:@_/b"-^ByTuMlTE@"UGV`$ېɸ -oˢGYpנ&|ؚV" 8-_D$ZJ ;LzeW66"9>S 1}C휃c_u׷A %ϔ=4Reud|:_x.3ܸ U{̱݁j V]gOG;i /7&}R(" E3EKʧGGH+/5j K =n"ӽ@2^쨄4ux^?H ~FDN"DK%LCiV@% HHB4c=F玷IfCxuBg;ߚ~ہ6]2=k)7) |X)EWа::uxɼ'/ybzg`RDIW'e~0gTi-D>GH= H& >M@z@\IS)6BH4Z?Q8b' i0pN? V;$ /GhPBvB$ztl n[[U5ɼ&R@JwQi|Hg#gH~(Hy&u xrt8<)$ݩG4 FP@i۶ܢT|:oR"?tHٕ5ghҩ4lod?ab]w|TplmVk-c] sC݂O!G`Pe8ΝmKԀɫ|-}ġ,exvGǎ1ij}6&M>Uo+=w_yr'Hf(H@\xBDɇ:ΗpX8%> $0f-;.m #k?: SD7]#$=z&A(ua2 rH9@B.V+T] }6qsR'>$;K{W |z_ľZ /*u&iEibJFF,}, H2@|?^@.G,d*Nizc,c&U]}.B)>" QƎU}};A"XBTR=f%G5i< ZH$lH6 iM#(Kx֨}O=y9鑧vR+,$L/4ZIOHcq"#_I=,:8<+ [h[H␇%zI=}20vb$*h9(8UT^Bx eҽ?[CJ t&_HYb4'Ob 5Haff~ ~g?q&j MyNNΈ9@ϦXYXZm@IQh|Q`׮ͺ]B$$Rs_$lFj/$rh >V-G23d1 qDC٭p~HGb /{}]A˧|]Ẋ Ȍ]é3v_r+*ۢl 7EA `,U)*ub͐r1 =6y |=Έkr^ h!$9'=6>x@ &i3PYJIDw~a#>8P([ I( ZH2214>tC Cz:Q/ej ѻHGIDٖ@wtNddhѫHδ*CDD~<շE#ͬy]A@z??xM@D8ޗ.~f w5$qw"Jwģ9 =P>I`\49xԉFLSggSd*] rgPӶ%UtK_.PZT܊Hd>W \d>Hu .%"MW R2tK@B[ΐv9y9@:(k>Є" -[}Ě4W7+[c|ՁP.)cWwbGh *HT`"/85E-vwUg"7~TOQCYGvwT@L TOE~䁛٧OQ@hE?sdfF!gqD".;?_.200#3NK~elaZb= $ch;_scS[N֩69}'7v]eWM= }eBD0^d\M@DCoV`x1:Cm߹ u*zK Abtf~D3VXU iff> fCtV׽ʎOsWog`m $LvW^Uoh[UK>-Vi=Bk-3ݎ,X"Ekho3j6kȵ.0g}++$LI4dD뛋/_rg@* S_<)cjܩwhHW?bVSXHЉՎwjoNli(<у%cC ]~v˅C7oK82[4#Ex$i|?c-{d;{ph"L M;F[h/lHhjPj~e3yH#:C40!-^i),He; n::5)ynU5zv}**J{LoD(/C-fǪ0 @#i:"z($yq%-V7>D%va XavZ.uP ;g(c[x]{`QI8CvQ/)>Ǚ/A%ExF\#y/ BZ~ `%QDm^ E6S;ib8sBΰXN*$詧4K T..FERpp>G]v`ت"JHp+A'ٴ5ܵT o5Mwy@h=q98œ_{b#|&Ǿ!z S1)AϴbmKqը.WOeK $~蝉I#&PgK xxMmZ:>E},ZB\pWqɃ@-G2~YkR(sgVGsRnQb~!,|A>YHI"~#x! Tre͚5EƬoO*ccڪ8ΫI+ ?J l*C`ZT@2Ɖ:LuauN?4F&AnbF)4 C{{=}E }}cq;{jV?! Չ+-Ay;9<ގ︜_}5UE6ەl[~Y[Һu\u߶-uIm"N.Zd;bm_]+0|nrrm-ǧ pO/UתҶѱѶScc{f>dv3SSK;5>Ub @"H਻+RYH)$\R 2XAw/j` {}"5꣟E@! Q @Bή1~I4wm Pz;ۏ  'IxV\dRqUCDFBڣP8Noq׻Bv}ӢO:/^qy\16I^/4 m;⪐9Oy@鴼⻰vONƌ2d`w{lwuX-z~zoD TnT?hW!AS;Xfΐ3_7[ߡ'$ P!Y܈ 2P+y]y v̮ՍFjd٩# %~h̽ :a*vŷKhcۥl{RՀE cbp $%;ł#wB[y@v>ui"@RI "i U"yy0lyp.NzCS RKT EUy)Qߗn뼭sك}Yq$}@7HоHsHONF0e+!DR%. F1!R'7*R%_GW(5揼èb%EFGHO ҄$Jx3I<جMA& ˯oZ.sH[%aOa%$÷uHblIS* !E5 6435ܼv('_nG"_)%ERRCRD,$@_gJJl~V Rn} T;gӛE԰9}L#"uYǮeڦ3'Cvc,6}okd72mm3\+v31ܶiG]rH˰ II~a}H:_)Uh z9h'")PVeWz "<5r]wPu|F*紁@@w:'dt#1.g 5).ntZh%wlBiBV./?$v߬`$DsO(4A;naI /yR-̍$QTfHUj0ch HX  4H7aFl@j߹>E' JD5DBιnMMm{jQH/8F-ꝘϑdGMW+ v4ƓpR\@42E Rh!dž^ؚx1;ԟdz{ Ym/4A;1`- 8Qz$#̞P]Wev$J?MRzTDv_Ghv\Q俗,**? b#}"e.:(_R-GE{k>vu| 3hA,Hg>MLݗo! q Hib i0 e $IdmlM=VW?J"AvWBNJ$-S& D?t"s{i8xTHNBoN47] җ}a8FR xJI ьCVp:9jJB<ͫW8U $2ew|z:s=,=Y8mwxXŖWۍRb1bjin 㑞H(B $]xmjS&d6k 8t-laWGDȢoHo0 @OHD$1yDt+ =.%=EK$r(4^FaדGK`1KPFP3D$(!S6IMu\Dz%;)>&;TmŎX얀G.|Z-@C/~Ig.lNE3v;]|>YJ>CչƒZ&UN6 )<f"- r|=Rշu:ZKRv'~2ڱdn>Ni\ֹL;Id>dc[/˗5 iҔT:Z$X,Rw%6 yJrT4{IXHR l)Uwu&.U SOtBY w~fb۝Mj@dNNj^1H t4IC$C AR0*^ɮ1.6WJigJ,`7vrőwI"0wH 3g.vkp8_q QwB۸َl;(B$^ve$ AZX(*dCj^DNRU hrԮzAtsHA ;⨨hUQH14N>NsikQX#jg& O dHR~DrxnQIE#7el):$vR; }oQGľ>!Oc1 s[Cʫ20uF[F:G%7󀝯]W>;]J7WM$ Y.Z$eD;لzƫiёE Xe3v|gA,o\AWu4o,{v]퐈WU~sAzA,;nkBB-N4@ ˒ <s8D@*vk<(B}|J-GN>,&JKQH[q%ƪDشq3h3QwIJ>̓ON>텨eSaab]enA'zHlпي\s<"e!L=_oa$ן+j?7iƵT$D9b^zr>nuLPs)츅T@ƨRK3\Bɍ̙^Tk;:LB‹V0nt`SFp]18$*/Fh\u(RfSN)Rլ,l0zVQUS3lINz]lS\Sj(i *gAa#\,56ږft^ *jjEf,(|hŕ8VDE̓kH F..[u-EYajNII.lŅҝa;:JK^ rzxŎFƏ,A3x3]ʯ4ՠ{}3o<6pJg t!; .ȏi@:u&I.0,YX4 e\ص> EB 7|҂sșȋ::7ca2I)BB{uT+{zNzݬiTI-OGQ$h@J0RI^g={V,۵kϞ]Vt+HTW6:::by7=J4" xvXX[[{wqr9 8;-R(kOd;j*↚`Ie ;#؉R!hU\6R9眓kEٵ,ݸnȌU$ktEFW._2wfgb}3G*v#hAm[$!ww$m؅Jj \Bi~I Ar]3&SYUDyGP ]<ϡusqN'dgöjĮ~ $CRZ8٣N 3!l7:|^Fx\~TlwhHf~;쉳};v~`v́xvvRLLFwrsssÝ?{i$핉T H]+ᑗ ^*kTtmObV$/6V6`qy%90gq8EHiv Վ25IH׿}v7:)iy렜£?@TpRAxz31>w\a}Y{1S}H]d@∑d[5/܎]ycH'7X)Jډ6˖~b,.~߬d /ˁaXO&N>唇1InJJ 1idR"wyC'tR\@b#5JδZQIzmU ź;@j :|#ؖ 8{{ HN1`aπT,Lˁ&_etjW-59Zx4 4V@"TaCv:-a "> T篋+,')pОnG' ԧ XERЫ$ Mh ˧.?-K{&Va,rQCw`MК@7K^|g [lRH%cHo,jU2#؁Q_0!$1q7^GrhsH QĂG^(;좮KY鄓IgH)sZJ׵"2!\%9 t}8%XŜ;$Y$qNJnꄶ;;i|16>ɧb)i'qM Ԛ&YI"}#4>:|uF 9ݲ4"("PIg/iX n/l[ R>Lnq}82#y=աPN;6ƍB5^'3Hى4/|*2dQh e iD>VUve.C~EDo9!E"Zʨjoj97O6#<"' eklI搸! o!R)ek!4rހ$?䖠ql- Ȳob%};in?i40"@j{-r^@zH!?g'!&sQظ~ xS;X@Mǁ*zWM5Pϧu E I*dM ŝX3@2JQkHGIeM~?@"!)7MaEī58oGZlu'%[H@K@zP'rH .Dzʩv> )4t@R*vވ#i*=<.3l.l@-LK¤ V*#3P5rƆEE;6B Lr6(V*66zR f ,,Et# <4bvjwEk1I1`+n5 m5L^)>\FGU? lS*f>T\f1"UVܮ(vK!rBt-%-RGob+ ־zlIcx>|mxĩ#+"i "vH/}ȏAC D҈S3G[[zb32xv/Qs u y]Nk 8Nf +RkV!;DVmrH[;$E<0RMeC!aCaI֒H!;"$M./I.TQT}{[][7JLkO \YF-b h ܩa<1'j1H 1hGcYO$ Oʣ'IHN˔)y2EVKuS`~q7}_~ F USĮ+‚LQZRCαofԱ9 8`w0^4"%R4JlqRsO4V B^@H3z?!`WPe{$UY$-m6it8e X#, &1]Hb@?|F#Ӑ?6266yIT͝$R> Hd;2 ˜Yi+B8#҈6tivH,<*j9Hr"BMl&D">JiO''FG ECQtKC\-Rԯ&nnBrz2wa0K}]I$˜g!Ҡ ؅u3 )!jl6rHAB;$V4(sE"NZH'Y`ţBKE ,>T u_9uفt$56y;4ƯGx@HQrfZ[ZFσ4"~f4OLFFqhk'TTV$h+'I|2!%dC2V) V  1( G $_Hu;%$ g~#Gn]& RHcdž(,pXI9˱ƪ3Y=&Qk h:Z^I.])Q Y$6HLei,RH,wf :MQ5/%sBvH ҋGa^< H.م]+4*b AـT Qt݋hD_#-v0$ШK:.h$ _M.<_]D,tWr؃ GƛYC{8XX+ RRH'NCwtDN"; K/$nNiF&<7HoZY#ttfettIv#&,y48F!2#"3X8sjBvT zAcQ`fw$Ɲ;w *;⑾웛R,o!*jRn֤H$¹]n<]S$҃aZc0MuhtHexJ aPf$YۡCBO:[١tDdF!9bU(+|pUBs\HX!MD5(kobq.I$U8iav:g0|eûu@8 HE%ąߕ[#*7S^"^%ќDw,vLػ~xv $HsHԀ>&C ;?$f m_~1FN-|I+?Uҷ]vѷN9n"@:d.vhT$>q<bG#$D-Ab1fesH7yF3(qz"!CP8+@"@ 5(ARZna΄ tHƐtH~9sj`:1@4@s$8Z&4 )HJc೴ h/j@=P%^G29Glc c3EP f!;4i;pv=g@nрd%84hj}T,?gZbd=k3M&'Z}ЃAҰj~n $:f$B"CIl^%aLyt嗗LitVkׁH.w-=H *Ѝ_WdϖC* "a ^IZ[! }2`W+G3|мe47&:lJxH ;A $VɣVZ/\,Ho~ ͛$:Q-螀fL<Ը6EKe=s<#4W}'c =@<]3V[i @G^@"Iyb?f{lWP_*+*d9GS$,OVNT!Fh[A0*P8,%Huu4Nq)"-3/6NEBſfT aY|>2HlT-ņv<' &@ EHUNEZvn;Ki\kݺ׮_i{pu\Y AC]CpEr(G,5 3?@sk* { KsH&H:9H{Ua`$8}A+ Ho׎RI A(ۄx"ud y@y/:$]U1s%m,`09EfܵIX@ȈVFG@:@)B c;gfF=N:,۲ckHL` @2$G6l!%-6lN䐢5 !]!/oMv6+/QCRI{@jrrmiL#' P]U .Bں:!l u6`*#t5{l@2j.~e5l,+4]0GT扼eHsPƘiH>6FDw: TuHi%V ,F<=u2%8GE %8IYR Ht=kz+ZhU|fRR6nLP(W;CLW@kǮ䬑M@R.KMp; $p~F@B A] &zo/C:-Զ;17+Ǐ}I)'[zGl"K򍏈HW$A AT x5vD`p)p-L6;!m9$h!$в*zB]2d!EԅxPF#ċDV8 ,r4_ E¯HiUv:>!hC!d.B9޺!;9dׇAEK@wt$Q&ܓC tt%l/߹r."&m' m85φ'+U3ymAKsE#g;`xPDBj$RAT lt.3 ؚFAՃRG|[ҮmH2bd $an2X<A2TRK8&tNζO=qxSe $)5n6d%w Y2X=Ak 50L`YIĎ)B $M{KT{0U /} IHw4#vĜM뎘 g5zG::`ZR<ߣJɺHuw"Y MF('GH[v@BETO|yWWU:&k@rº:rG#H;&57끴gӧcۻPRd!^Llv [n]<|8=T*y#Yb!uݹwpC@y#qF^' dzk@`$#P_fBw#\ K BUpt#f Cr)Tƕa/m<ydp9bY1]Zm=`)Inj!? -з&1[g@s/4&*1 RTPܨK][jlk- US],FcA%HEadi`DN\".UhЀ 1 ޜ{S3sv2Lorϡn~R˯N(t,V̠tڕt{+Σ.aHd()i Hi`]$:î:f!5wMj`%D } hd)q:QwU kRH Q, K@>3HT}'{ r!rҡuk_Ff:ȱ& uﰨG 8{T\5Nܔ]rj %t_qC~7Ӻxe k@bu%pZ]wոfEG[UeҞ]yې$pHFR0Mg HRU(j cx< |PC@zE ħB^*;>ƭcʐqE  h\%D_'y ##0nt!qI* b]lR[nO\$rz H#z(ĉ. <.gv:(@$Kei!B}]hG W_ow t槟  $]t !nutpKK)g4 pp) I"a'Ҿ u#nw8 ̳r}ɒ 2KO&]wߖn閵7:wa@e›zzֽ0o4@b cw?2DW*Si.̵a!)!{1_4C&yYkW $VǼ}Cn@ⅱAiߴGJkqUQ#mxu\\v#M:HrҦQV#Pp˪5FȪz,J.`82ĚU AJ W+uF_fJet7aR[]՘R[x H- $ƑU?@X@榅恹,Ӱ* vVb ɹdHђ/z_Pv&Fb%5IH Ƒ)QtjF"h!ĕU-EFIR3XA_/k").(GdP#|,yt=MB + Ea'e,: -$⪼ eT*ވ"I*|Є"Yv}S\Yv?N@q~Yv$@T]tqU!A1‚ݻ!m@.;{ 7% iP[RC[H K:Tҁ W5'nuNj`b5.t0v*z ;dO`4klH EH{M:%EMF OR(м*-OD#iߐ[#]M`pl,5Es4/YHF ፘ@R[,ץMmcDhTqvANry V&VLbq!WYGW)MtkET,/.[5HEͫUk=$ $_$n,Z*\ Ʋd Yt ֆn}vܥ>M57FR|LhΝ>Ν8g8ywtdg 8/0zHf#rcH/xu:Lځ8fQ1ؓ%? Hckz ij,PRy=T:H|^cH  XB% jG&`V9 IU?I h#CYBh/==&{ók͘7kajѠG$>ZӾqKN酝z XB:`HhTnKgne@uH8i[nb]vo1Kqf\|DV•h "1l ݞe2SqkAFj$ZHdmc~'cnЧmJ g\=-CRW/750w|Tߐ;+d\Y!Xzn 4U^er~.W㚘HF$KEʭT9k4GZ!!{V5L&:spPM= hmžYE!$젦h$xTd`` 5oJ[hhH)$qG AO 勃d4Yw\>Ә3 ':mȐ{ )m"MDۂSE&$ $.=yݽۍ $A&1nD:w{DH'YHY]2Ҙ^c ieK=^KZvR& |VKnJn}1Reg/?80a#%Fi)a^ A`MbWA$nsFr)y!>Db ݑ5aqd"+: ְcgl!$ֱdG|""YH $5)'|+ف(c $TB'JG@v\vGAGpYRyIe'29;;80Z0~4h+SᖉJP$f,.3Vd @b 8ʟMх:55x`m 凬@^aQ@B"e7\uֳp)+ЁT+mf ? #NM's ײ3E0Ax9P1WA~ HBvZakiȲK3(gg_pI#w]{9& "\of }=g_ٿKdŞjC*' +H@N vy؏u+7$Ĉae1dpʯBU.b l <ה]QW41b*;vUau<-cكI}۴Qa6'2|?*uJ19qXډ'%u kU%o8u֖&|&xekZ73ڧ- 0iNt'cHwvʻwsaw'ndiNOD[qRdD" 6"MI C1iQkR`c?Q$wo."Gߛ}@*(,ݠko q ;Kb HVx_׿#5ivA$0-9@ӎ6%xY3IqS3٩{ 1ǓptP(dCt2#9_t\v(G\so[A['In>[FgVllQoHCfd0-m.&R@"SHyDQj% xF;u$R9 Rn;m \xK.TEfVկ^-F8\hj]ѕ?/|`RTgckjHCzEl-$>{RlMN$cOU03 !1&XH Tux\tRIOդ* 'Vu w{awc'CL;}kvs~ He$AJ*m!Eƥr  $D8@)?@zBҁ8wt+5,H =YW!N,6\vWoH]c~Ƚj0t,t5H4²PHl!N-8e~o SEJ|MC- 08dHRX"xtgGٗ@"$8 HIgxHNz|d-\:C8(yY}l$΅HF /HDb6عIu&("1XaWni%vX:xs&yN-}y;oU05 (|ٓ0$ƣf kH &vPJ݈> >ӥ"o첓Vתh! ͑)zyxm͢~lU 1!G_bJo7 Qw H3m4G i4; Pw ), sHB"Rv )LHu8s]F 413 E{ )@,;g*)g^' dJGːG*8HE8XRǐd XĐ0GǠL^T7˳|PK&~rܱZDC>VWf]ge':FۋW$GDr|rnMޓ~<԰SCj$fE&^U#{vO=8<92ZaS,;vF\"6_TXp C\;Z!G9ɋoΝH $hƛɉGz;6lذ>`r!uS\AY(T&K;9$뼈<̅%~C$!-@kdXlcXtHk+O74Tx}zC./1/SGZSYvT Heqh0ZD b6Qr;f1DćmB95HTjr~ $.g˲I4 $ `]mw)SOM'C8k:$egR \e(AJ&B>;Y Iw^ht~/^DZ_z2)e=aw7U m:?;Y~ڵ,e/%焳]{ 9nG-Y~ꃡ,_,b"jkjjjjC $=92iDyquZ+'K}E?rL'S#g" hygo+хIF\%ԓ8=5Z!也Q~=Ta\[|WT iXR TBv&Z/d7wYrՐ3XN5"C{)(JI=/twy:ӕO{*ʏauZ5i,e+P{{nܼ1"ԑqvbb*gH]͵-; ]e)u{˶ m}rψ>YB=| 20N̠N=r' "lr(S8% g}r~_\RPn߼ݗ%N?E2VbxOWǞ̽5cJ ycU秤5W~CAS/j8uYU-N1ͩemYzD,۲N`i{(LEpG̪e~@ ^x xTFVUzD*hCEi?0ZĔ)[i׮l}90 F-;1X]YdL=e&l e¥i6l„U@oЂcMrZ$u`u9S3I[>6g ãx?Z|_F66Gk l1Xs9p7Jfc =U7}Ν7+}q:Q9zSVB $ xP3P?D]"$AĄ.?޼9JoJes){d &{KWXVtҋ{J eѧ}}˦$`0l,s9(Fay998r;l6GU1K5XU["+BNFƔw1V#wIYWg&bf8ju1 yŃtaeI,MǎLS2Q&?s֭[i3cjٌLpmI֫D7܍掊U֤n+8-xMm̖,ͱ7ɜX:d3 (,FR(um,RUJ?M83=vNus? dey/oQG*XM4ڇe+ q̴`#Iv`H:$<4՘L›<^*<)nQjМ nV.P ?#fyא;yh [ANJqGFm#b)^rZbZ;+Mf9 3Ebwg:^< =5|0RS NLDW@89U{gRjvʬꎲ o/mu:EI$W ]e0]a蠹 i!̾AA?O٧v1>L O{㧁MnK2h\ga RwXfx{{w9F0ʸEbGARzz\O}2"ڢ|Pf#rUej̐U87@Z p*ZN a yctHV󯆌!*Ʋe'Rzb;# H`ꓜFm?r(`7_I an15 -$ %QR5;) 4{ Hc/O T$(r1=M#<;ip,/:-&_lx$6 at$\0:(V+2, ~}iz⟝sNP#7_POo60IcMon8=S[ыP>Ҍy=x WX+|I&e\,;:QC=OR쀴\GHkVJs,ɸ]) 6#\0tv3a*oS3DHjDʙઆm|f8ǎ=GIh?k_r/4#w,…S`~`م=j6f~妨Ms8]3 vB*J@bѫU eg%΋ln C0HUAE_.AS;9䂗!  LHq? ܕF1axA#@Ƭ|E[[ytQqL50hS!Y$y8mI'H`D;1<{p$Mp _UكBv"#aQ` VH/2`9H׊$^(HV?1DJ4u{cw0HgQA1;ZPQI1H<4}GՆ 38o<گˠBS93i\P)H~>(Gs6I+W;峫0]v2˒0؂2{keMccr=kl UUM3m'3DX,XHj)Ա\t)s, 琴 x\J#ncps6b7c w4_O%9}窽\I<'a0'ު8}_Lkp#zQJ[bXDcMcr|G A;r@\85@Ni;OqEiư 1V$)SC.(%N܎ĎhGR0䖨AY&_;{ۖ/hAQH"Q#oP\GCHhSu:e fYHro{u#ᖌ@2޷S"[y ߭qGqvWY(yɉӻ{r|I p W{bQ@;A, 9-a&,=*HtZ]sj=Z$a}+[{! FL5`tH+ⴣ.\OegBs%Qf)ց0DGZ_ۖ. eD7PI$2m=~|@bJf!D` vx/Q u55Ea)ʗBW4lQJV:}?HsE@$%RH$x0@OhdX5i:$Vx"PH O ɟG Ѻyؖycɦ;T9JO[>E .̭˓bZ sܰ|Y^ǕQDRsY;TW4cGS2Ҁtg5MSXPWP 4RhՠT|G mdlEvh7ap@&#/P zcȠ Hj!N㷴!vWJMC:"iұ)c^CHiMH雦4-AEj.J8EI YFGR۲E6k@bf* $a j"a|m?޷oq8}_x40dP:{ƫ("HD$7bv$H!~)H+$,r`Bmn 2G0\%!D; qH@_2EޝH$GNɆڡ<ꋴ}>Kk40dg=i9 Q?J!o^H h𦧣O='p';Ɲ xnZ+H"eս}bk wՊN!9yT%4~m h`Nt/ mU^`w#fGɽ-n#^9=I-^X$QYYic'5bB'q=zT,ƙ[ ~G8mxMdm|_tH@\/A7)-8^#{6qH -I5lZЈuR*^M{0ZdRD>L]C')`@BI3^,dV-Hs#O$cAB6`~%?[x XeH5'p Kzof6ݝP_6Ez==O)}Z2\߱y|Jݷ",T_)ɩsn$V*!;좝k }HO4ܹ=M-7=3HcO"tP,Ttw>^rBWW): 82;nϐ= Zn6#K:RG;bpIՖ hu]#Oe1_7T̓|pZE4[Rf4 :VԿ $ǎaʔB\9G8w3C"SQ^xED`@Bퟘ}?FiĄ}j_Tj[n15>?U=]4MpaCSԐ@T& ZI5H|?va"Rc]]]_LyɆy. "-1q/<^А_K x'ė@ Cw2C?^QaTH-9$ܨWTӡ($vi,ث uCc'=I Iojxxj, 쎓4]kΣ.CJC(@]d= -MhXO8Z!] D젟5@Q(呪F9|(dtȼyQ3^Qn7ZhϿL5a<^,d~DAx~4 Vq07oF' Ԁ)'`xeGQ=*dKGTఖk+j"II}v{yH-:arDȩ M"$k l 2c&$orv-XAYE a4V‡N}Hߛ7  . 0D IԤXatT9,dn<ʸ-< !rp}AH$($uH)Cv5L%BX %闯B̂j8F Rct wş7)uEN/iLEpg!%$l Br 5nNƧ$H2rAB>19x iFL"Ƿ3( ʿ^lU֊DL;k)珽=vj@r {CH66"}vM&)GGE>8ڑm*x?$(8$5Tw /zFaz"/C$y ڥ]T ƴ + QGliBjt,!tׯ96׷PX(y7h![BYgd:A,BCrQxDu B8B!)8:OR fSKP <T%{rKK S-RHbu߳Q[f<{堦ۧ2 4ui@ rרi$x}聨$6$IHHƼis} a%Gj0^J8٩kT Rg%"uVHz@@$y;2spfwt{L |--CtɬAM /h:M_vqY. ,3"\4dL jGq{g]g99+²{>}~yVp;C$,RfxdA-@k*H$g,4u1_ G/!$@KktDF9#1Hރ/\:k{i9Pa @f&H,U,lߵ[Uvw=|MT'!Id'r}%tHKcQSSw4]<|R)vsvĝbD$sHjJwmW,bjƹO&@RYv/Hȇ541z#qEb1X+:f FJCgWKqN 'Gxil R]ְ_); ET9Ēi MBϟ{kH԰4wD4"$A tiEQQa3skऊakUGp:NaHb* BĀ?OI-tXC#~&Mk r$!B H KjwIZL)*-97zKNB%7#5(/n4HtL:'Hшh_Mg[CAɌHVMHq=R=[J INrHoԹə/a@Rx dNĥLX*NaE d"1UQ.AEbiijD:FHHT[EkiOx8"=265[ M#RZ.õFdG=LƐHX#ET& z' 5@zRɖ|:$Ԑb.7xk:{# y8R_G^:H:0Iַ{5A\m<܇aN!ܜ=mT!U0N֏/Q1CJR᐀#i隰m[+؆6$Բcsxkis~Bdߗ/%)ɜjM'/tյî$ӣYsdW#GO Y%Μ#G1Uw^gu2Z}G T@*"}xpDGq= $bdoY3r89*^#y, S?C9$yO{ryֿ{ ;$@dޏ4>iqShx2 nf+%OT(ဏ:I!!`ǍkO9$9+X8(MKJqLR[*Am| 70zF1ջUU /сBE!qnȾXէj4:6SCHtY)FmrEN/jߝx$Gq<݊FỊ+_}]Sl(vDyAhex(GO.ow м{TWF{-qOPGFkm5R cϟʯo$[!G% Cj`kq|ϩ%j|Pk.d;uNH;袍QAX1pj"go\J8ȡt]8p)cRj* cmrliNo8 j-0"2+V'}s,YvH6#yN;2xShpwCq Z-1`DYKrr$;$<>$d@2 !I B8|Ȳ{Ga~Fumφa?C@Q g[H~g3@V2v48 @J| 2> 91#$b(F2˩ґ|x^╡@$7lDa'>#"1ZqEZ1qeUD2$_ip BNlwp4d?9 '{QCi{㎐oUXRkqH $Ux@arH9J`T4KB-'a×?4tbKw[WX $ٱᑐ 6k-L":k)G)7^o{~O_E( $Q@:3Fi$UV$Jd Qj4F]r/re٥@8ʼCȎj)/,FH|71/ύ :40|@gyȔ8G\g0cN-T'r0H'#Ydߧ2HʤiOedG0E>X-sNC|l,1@#tuFpMi.Ɛh^,>9wU%<.Nj1$kD8ю R8$}Nn8W j7ݒ o5ʵt%0T]J#"aBPMX RpARet {4K3޷pڣs'wwla;3I_2 vR_bG*BJe_tJ1VƐhaĵN$.H P~dop"v_탧 qeyH _󐐵."Xxx.̖;#"cq{U0+͇a`W;HH81$Rj5 d;yKvZj 9n8$:Un=5G]7.>d9nX e i)^*^Ϟ=UEFbSAȎ}-Qd*.';wA<sGsŊ٭)-MBHIeĢؙ|gGR#A)h3|Ȉ=<=q-'UeD$ЊQ8d}k@!i^ Ƒ'Z!=^BBҹ쐂JښdCb-n}`-D-MC/|'}(- W@Z @Z0 j0,R v iY(h8soPd4wg:h4;x;$ޤG~ ̆p@rF[NqU֋A3jhFIVL ӟ#d#KEЈG*v) 7ɦE_!ѝ"8*Yq~q&` ikGaÝ'|=)/\:"VL5-5ɠ\sUEg(ȔeUk/]QpEB<twGXچy&nC=V5VPFUQ:?Y7^jŮ4&"m3E MdToٱx^*[o!`c(` R1 A|rl# Q{%iMⶉv1{i-)f5$Dz>=wHMs$$ls$֮[.:ܒkt~B$ o= ?qK~P -};5RCi?ctG `e ܒQ3pyH}CF2`Q ǘ%0-pDoF-j茴 ޟ$XٸB'RaU&u ܿ4YT1ifZ.9<@ŷb+IO#vͨ*Wň1 H $cɓw*Mr1vm;9FD]H<[ 4꧙G}@;kM@N:D;2, L^e|G^ApOYA(O II ˹{YGN8RE(*::QHlRH$H˸R.il.}z&"[85QyKKy&hucG&R E^'!:]?K9zG45w"\̥+IRXn|ouEBN)A"͔Y.O-S/,Hme i{&1rvGOjsX,舸(;id$IJ}[GG$ ڕ1\Ł @'=eTIG`q^^J&Iǐ'4* <5A"I>&Zҡgc&xdi4kR43!oӁI~rHد$wV[ϴ65FH׮t"Y!Ap3Q~BO>zP/Z Jh-HHS' TJN;PZIlE_2&ZHd/L@T)YvH4pL-M3fFt-/K| U0`|2cCɠUt-Q\:F{'nMHG Hpw$/ۛMYv[)VӐ "ws>gMH*Rf-y D!Xz6ACF0E`%{ OL]o_I,jWG9j؈9{ܨ"b1 '/E{o]d)',| ςYݖ+]D 5Q#.龈Ξ:Ȅ$=y9s{ga@:sv~aUēADK7@{ފk@DT;G*. 4iHڶM yr.Ҽ-I&JF39jW&G$(%@M1UݛmH|YM,n#+55dIן;huFc6JsbJDJTc @mםHY0GT΀R 7(xgHShO1$94.tT>pD<J &+-ȌfLi 9َ!(!@%+ӭ-qV:EðHȌ-ex:#"`D1|MdCq#oA: -U@i9ՐadddaCyx!,Ң3J*5r  f aN-]Ŝؽ{?zo $,mNx 'C""0{DRp*JDJ sgC:D ٥*ajKhUWƩǏ:&2Koi4(DpQņr xR1;R|iVPFE+@Eja>ܘcٻ-nM`m0f 1>S=a5kNE%6{m;r>NvOhn+$b'ˌ#ۉCB gRP}QΫR 5YB{s^<f᢬rf34քyyl4HZ،99q5'p ׁ&8٦ y4E@Ӊ{ !H7ZdD,kKx9HZv%14O1st!9,wpz7pGaIx$u{B<] $$262HXYp7~9X L\{0G85WfHG3NpþjӼX4Z.j -Q~a$5"1;ƏHCbWݷH~ǘ 9g& zNi 쐞#@$vHPwj)A;ײʓ6";$Z ͕VQ z!F0}ɑ/Z:OwS8٢NYrFņ-RDrKƴ[Lj\bdwZ$һf"P1 ՛&Tٚ2{nM6.:{ƎTHYK<\.^0Em.mTdLvYA 8˪+yZq-3P2:lƉ9I[" քY֚ aTfRe v6)v Y-ٚ;%$H2WBMzcʟW~~_!9$@H4,Nn$e߾$'"Aj1- \n\ƮBsr 3c+ͩٛW dR4 .*JccAFl a{ $l_Yrm˧]˜ǃRFE(T4´yD鴪xW1\J@<  Fdpwpm` Q2UQRicߑ`7Bn }}' x4:HMDGt8Bǚ;ge"Z`ks֔gD.[i@*Ͳ2)p"=["Sa0ߕٰxW> I_ /ܐ%eӯ~߲@_tT< |#!`KY~d4LK9<x=Sj $U,Gf1()3 P>;dU,ICu{ʭ|MMm,?k9@Kg血 8;io-[y|>1HHkZCwPվ||+(@z[ :?QUޙYճgBqLJANg>N={j L 8$ s*}$"i4ۼ'ߵ.);,ڐ֠dg˕t<ɡQu5"5-7TǤfd\qi )Hn>8JPdN$ZzBڃ%!HHNV{vRR*p &:zl=htAW~UEh%wѪpoB‚eh]]A }kq[&]R=.欘'O>:##.9/~&Dߟ§OJ#%@«?D d)3*ɣP\"6ծ"hv8-rMp,Hw]Y&p}$&̯ŝUJ;aSIbqh48:2ZKL`h mH‰ԕ!/ӣA` {bhNS H2l( Qdl)'O2cHHP$#IӉ)@j&@֮O1tPwHxIpl9*hߜ3K[jM!RY_ˮr; i rZ"ÔU< %,/Duc7i)3J<¸Q !ɝ@dylV cm>ͫ%z𽖤v~ѭ鈳Y2kʕaS{#ƖټV8luϥHNofV4"dg~xtJ˖Ys#5s{s ma4okv)Rgpߩx=tiϺR@IDA+^Zbv);~'&[r<9N~ΖSg݄:f|LSO:QNINJup(r`V΍=]>v%'GrC^M?ɀW&dr4 Q LlTgE{H;֬IR/kLqĤ]vSfJ 9g.ZU4{lwwӖ`w~?C{ŋ_H}C}¤@8LF/ >^8}/{̞;3mU=nwsУN6=BƤz ~䞣{RQ=$ HmEJ`8?.~oCA\рH`PqjތEdrW(M{4w2ZSUڅʼnv#SЮV"=~|zzj9ZH Tֆk JpHL%'CtqvO[FnzH8g˳,Tj$Rj2oxvn-/LF}b5 coʟwlC H]GvG*V끽uty|1{xJam9.*Z]=5&iT$\~T]J>߽iG'JvJ8hgh+ܤ rS]%d[Rqǣғ ܐ cJ4 嫐Pu n}Hׇ2^sCm u,FG9zZ{Իg T(ntCpg ݻ8½2z!QiwlSb;8_ya-XDXNIV3H7t?~O4  kLw/ZnfѺ|i{i)b~{ -9M/FJOʟ>y!ƐZO7VVUjm?tCPwZ֊{@/"+=\]՘ގnq+R3ڢ+%uv}fP-i? :![b+p$qu;i)|U2g\fqLVr_ErH;}]= E_4aDҹhaEL^ԕ8VHbu~ڵ:<%'Y,xxz *P؝( J7<=ԯ4R- #E:_AZ;"tվwEt br )g0l1,Wr6'&;t1 O 5\]-V?}Ful .yprFS+{H4vcAwبN棤 I:$)|=zuzS4JuvGE=;z9>0 "U9~'qHl7~nN@;N$lN@N MܲbTs8b-i2ߣ|l" ~֭͞ځGŨix*dϠ":+ZLL Y#օ$.f@җJqDN֙0n|/.Lbօ/.ZzSgŊFj&W:@Q:xhvvrV|/V~t9͟X"C1W )rPQfSnw}ңUb"iY9DoIQ:n92J n\M3CYP.Mvsf1|uAϙ|T+w$$ FP[H?hRkR H)u0`(LE Vʲ2<>thU5@BO?v#RًqWT4Ph,'C 1C/WhzP{MeS>&*Q/nz0AɡJ ^ǡ:ɦՎӮ0D/ѺHqG@>}>D)Ym.eRfpYۄG5p[[y!ҿCFF#ܲ4'B4HBWH0buKi<H gšyDUwX{!N.&斫E+PΞŸAIנtF (%D v2c'@""qt#ҡes[`\aOEE> "f &p1'qa3;$"M,9ytm?ϻ@z7QFʈЀp4zrܹl$!G+}biHd9  -2 Yyt󈈤n,n]$@*KT  ^Qu2ޜ+zc̶,,JiSJC>-C sDYBtqtarsHߏ'\rܩ!D![a8<2]$2L)ti-IԔq|m;Cw6rwyy0>J6օ urkM@JمHv|=)\9K婣?O }'Bͦ-πpUstY-83F6bD֘=uۼlYO‹#H-ZׅLϵCZ !tTTHH_\Pv酴# hl, ͕g2]^鍊q 5]5!HߡC s;M`"5t;td7rLӭ<Ț'ŦpƜx؛)ӐTcj#:} Vc(dŪ(\Qǽ"D,I=u.Ny#":(J2#xkF@8s{uD$wHaW;;\Bv |SrYiՇڞ>ѫQ$#DI$$N q<ۍHV;;Q44*#&R$`ldc~':|x Qj<;Ԓ3P4ަɶv2Qܕ,ړ?8JByB@VWr)D@,z[wrMǏ㏨2vDt`C?t2zBRA3"A>$N<gH;f42G52gJ_X7N\$jT7iOM)j!rzkX\깴#;dfXܯv8H G=="tRI{\\rE)F4]iV&H;Um00ã'pOˏ> K{znQ{?dg6l (f` |/"QoX$eqTn|oB^t>nG@Ij*o {HWH#"_oΤY*dEsҮ6u) ,]6 iu#4)vi"7tëuҰa|]]{d+|rxH**h(%0[]]= l> 8ҹG$tT#bg벋c<Hh#  Y@z ͯ6z~U"l<[}#U$/~%=HGd%i3 {>{-\c;G1+CETz'gX<<|,O~*L'H'ɪ*73#'%v" )9HD$\[HnD#b;jT YipK-> HL/5p7@R(le 5Ųs?y \y@ѱh~R!&xN^`v^@ I@yQIt@5<ĸ)@OEȴ yHӯ{BRve ^} @pYAHv-T Z.BRsMhbv\, =܏cm9 "0uJ;dWD#0h]H/DZ ~I|*daL$Gt4whrb4q@jCrJk-̍ Ig.:;@! $R(9HbyHgNȤ#Io8ٳ ?4CZ<@U k(ڎs<"uOV}4ڎ>qWn9ڎ_@pi8Z0Veuk%^z@"HPN@T o)s vX؀ $/67Y݇7ʵ@by)sf|8rEnE LMT.:x 4ĥˮkٕ^RS`ߊfڵ * KU=F` %I@)xHC!/Y2#V-E^⒝Ԅ#oܸ|k4zGΟ^3E(%'3+QCsEDMIO"\0'DN*Rc|H1yD&'' As80=Ox*Si5 B- y~}@u/Q`=%mtXЋܗ@|~z[$"%*@ZjqٖoS~m9{vux_R#bud@D#\3!;%!, Ȏ+. uebu*Y@rbu $mU$C=[S v";.3!q#7"qG婡Oы;ә~4b08" Pڹb";\ARGDRڹ"S2&"[< \Kr\ m i^JlHBE"~]FzC OȘ~EvDcB\ 6nn8r drH 3~%z_~y?3o4mzI:Yj)@x~qwk2 "\@F ^sRT٩Ӄ!G v*@ª@{#PAœӋ"(}l0]Ol$.'o'{C1pWJg.@3^ iY/0ɠ㬼;.6+YFi]G@"iH_S U)!;Br=$ օ I>+@z H ri 1=%*~!h諊Bsz + =-?nHQ2򓗡?B;3qbfrJJmH<'ÜܗoaX1xw$l Z+)bDm MR6mhspC"*)+ĻcrH2_uaIW:LBvR45v^'J*;kw1;;Z,jX$D쒻-HΟ G@RKٝDBԎWZ&4@$B@uvh.I-2(NC _00!h! "v8F~WWEH/ċG\@2!1&F'N$3 2ҜDsА.Ўtw"!H@#PYN)j:sQK.P\uLT'@J@v% $_T qH<.H|b^fy@o,cŌEvȎQJ@$o}[BS&=@3 SI. ˹9!%n+S 65qtH.*ALQH $&7.   FI"mϓ5͛]~@! jz{;Kaķ'h=򌚜(:3dkyLDrw(9ZR DK]Jh$Q.ՂGB H^FrDrQ;DR 7a\c@doF?st7 ~@d5/o ~OH" $cDtbnq4HA@rR6&aY~#t2 g/yg5t^.k/N8H$ D;Le5\$*NbzaNQqWK;"l&,HKWQbE*;.3745 cXdNJkXQ AI˾]z!=ee/\Bhr5_DbA\V%J=hJu)EjGEJ"E(W,]!sK8H+wa\hܷ#N!\$LjIrX&5P"UT<љe$νr*04^9AUE :mJ 5.(,΁0"T'@"u@Jtr,k߮ku"$u|/`;$IQ$'4jw>5EE>$^QAQ7/RӢZ;uVf"RVw_=}l#:<-=OFmzH>R^]~R8B k C1{H%R5zip@Ҏs O&f5/g:Vi,cutU?zG&[SKAgX#bdqUK[@1;\(R"ؑ6iV6@PPd73vfP;[.c414.XFRXvl 5 O`BLZ:xHnjI z 2(g'9^EXEkAARc}h5HY Hم "=z,rT#ďͣ~v =htpKNO/O%G) m2bSm, W]TGeXHV:U܇BaHEndz=@GDXT{CaF|Ϊã{CG8q'X#"<;xnA:>N-mDvF%e:2MYJnHXƮ#@S`XQH(skl;G Ojgkר~~Fu5*ǜFxg,˘Ab61xlW繳evnHɔ䪆KFƽx 's{yunC"mUʾK') Y2\kAZ^qVK8uMM ۂ@çoߺÂOن&z uv4pZ7G{?L(8P঵tBv,+HkndN&]U {7EgL$ dQ |1]ָV7IغU sV>]z햦r7ŦZ9HuxKTƒU{Û^!&98h>)e;~F5gkTQub;k*EV&s#=\$qm@O$խR=\$qmd"/ )xW@mHmHhjfm2bv{,Z4'Z΍MHt,nevyI5lƋ*@" ̒{dv4>w eH sED.V] -wtgqdĤq'FG)F@~ͣ<#j4[9"GEɞH` \Y >Rt}qc Ηt1iwI<Ҳв3U(*E.w 5^T#HaQʙUGzN!AzZ$ 1l@Hq/)#R9i* k.@T[YvH|YDWIˣ,L$`gdYf' Kuey[$>I%&`P4^9l̅< j (}t?' ڛ|Iu4N9|;J AyAI)I q7L ѫ)@2&TyQv #mBWK,.Lő<)`4i>avrXHQ+{9emǑbHAwnW.Z/ "#mm s(0G+"*=^v͂G"DjמR Aʓ@*C&"99+!DrFvD_9_7өKO,;}Ю'ˎ>Ȳ]\%p~ğƍ=־MTrR\@\HBbrvl:?_?#hjr/3ըlY:wT* 3i9>2YHB{ p ? 1vf uYkrR@ xNKQ/N]ŋ9q{oJDF?GbsS $_+t:A*X"zSJR"9U")Hp:2V :EWc.3R>ͻধ8[9.e, a;mЎi$HQ.O#E$E[KKB|3|$ęM=I}}oߺ#I;I"BW["7&KMY;,͙?}2Q0[ɏG<ʎcv6bF΃HIV^+%AUb*L@+BC++'VT٣ϐ D9^DZv^G~<^j<Y QߧTo>aZ  H6`fp_ŇEQybfh#Od;MpX#Suv)N"JP }.$nIy>p$$Ew@F2(&RSH4R7Yˡ!iK\ oL#[;s2z<RF=FG/$J> }s Te}bvt\_kCZpj%}̩HL$3xˎ)0۳ӆYPpbz華Kqhz@U&cധHVs:jPsGHeN'ȯK 򀐵-dUhրߝjR˼6/2)C/.hjڞTꁩSSR)wZ,4PW'grGL0S%bD&p5 *8^~.~[љ4wq ś[iXVpYEc)Uǘ6ӦK8.aJ#+1&' ?c  G_H/ HVᚲOt̵LDٚBK2|I%} b(=ӉDB#o.8{䫲#rM ~#L\ҳ L5?ڃ64h;ZwFQǏ|hHbw`K^ .~%.6jFb;Vյe6]ܯ777G;Cj;fG3\Twjvuۅb]H.SPH+FRCrծ2ZY1H,"* C2.Ovvi"3=]97+$\̒cQӧ(-Dg|ЌsABc@!ezGxw _ƯNou$C}̤B@Hp*$)!Q6b ֲ[J T^ rXZ=a9Z/c7Ml((m; !x_PiawZ MeU|i$mܦ+H#*q+(^XO;ligp ̣ 9#xd2*<2BFNFv\f:o88:lu"m"&x8+PħP#Xd+&R6ez;b^#fj lCDF;h$'H v :(6XY>?uPvKK{_N! ag"ohem( Z՜>R%6Yd-ͨ=ϳkDHI Qw*kIRDq Հ:2%Jx6*9#EPYѳ29A<{DPsϮv9=ev=]( uBr_h5`ܞOZ:n|삱n:|* ΥJ? e~:!`,7@rhFʶ8P4Xv>zQcRq@jmhhi5>AZhJGű'yb{_HbgG97Ce]U =L'<ǚOhVCCJ-K*]|xuћzSo?M9HIP$1DW(kԛzS f>2ݛg mAOξr5 vd[R7@~@帤z]N-dnVj{xĩI1Lsɮ>cG9c.ӓH1.*HJF O#a]/$.֎f;gîr0J@QXzp _\oRK4bgXYoN4s:9UU._K9!E⽆ʻ1,Ȋ^XĻtk5JV4 5yQH4?pNvǸ#Q/ԑz8GO\}R!OAfГT1Q\oƟڒPRG˴vb:& zuvT1@#H\S.IǂgKr/T_*gZo吧{[gȫ<;$f-W1샓DF/FՀ` zE \p~h, 6!q=Z{7*GPA*X;Y#1ͫWEcQC[4EQ!(md0w6H4Et MO y.`or\k.1.Xs$h׎1}"%Ib$}/C[ A~T($. IE$e =-)_hx B*e){io0ێ }h;Sێck#k?uzquFaMY ׁH\O!/@s^̌xY[!hHla#.RD\ wkDr HN_9H5ݹV n:`Y1Zw /ۻ ڷ w*ݲt@:W+w"y#!-=ϑ9v)~)E75xma_3Nh1哾_ sife7'G D@d  ȽmǛ{Sao^A []qRH(0M9[)rHDz<.I=4",\ݳ33Ͽ⋇bC܇TZ ~@#+WߺA_"&③ԘxD@2)_Ȯvݺue͋n"5ܛ=t>ctL=B "U"c| ?|-%<[Wy*-G +4h_qwpN$F8!+ \$pioKN`ԺxH,#6p0$佽YVHl@2N]Tn@j HRlNlL+ w4gSsvʵ`Ҏ&e8bK1Xl"Gri|('w2"S0Ҷjkg] `liu"RG@oغֆQ oC؍F@D\##׎#><*?P.cUHeGGF_+4d&Rɏ96d}a$GB_p8D\qDXAD[.t)"*Q` $$" wݭY$G##7kK GώbJ$$r\ ]G"I4jElJ.RVH]t֚WUE5Y|27 ;HFTN@  H?$~\+LK†ɷV:b@l;}y\۾QvXfK)CjB]7A|y.vlW#b`ICqiYLK@-!EE￀nV>L WሑG-yAT=xAI?%8}9YIQ$"R8/oK(csyyI QAT‌mH4@wU 1% >R/S7^`"SW<$vZH.]A;.V v k%sJ I)$َ*1)B"Erk 3 RL"iѵWUCdHA-|)d0y;ӝϡN}, EF;R슔T(nvxw+·d^|2-Oo!`g[B0BC7n ϥ@Z}bN9Z<|Cūqgy-OWK]ۂf+A=+ HО,8qf}){kkMM tpTYh77?'/膸n2DLҨ|rra>+tXlglR4ش?̷kH5[pO5vrM+H]~Kez v86n A? R@R5FXhDo>hjiAKcY7J!,$J 1M|0493w Q;{fv~s=$' 4wrƒdw4K :PLΑy KK>zsdF'k`WGrdi׭TWgj/SJ}6"v߈߼?\~#?cv;[:{3mFrZMLʮ#,> { #; fg$ .X V '#Fϝ63xE܎?l1l8wLۍ"W^'$btP $F %@pyCpci$%h\y1k\$LJP^(NuaWN:M$Ҝ $ë$ 6n$:vEݭCpH>`fw!>6ݭc5 2tw 5qv9v5AbA$297)$b#N qz<$Iz@<+/ N!5 x$R}kk6V/]0ɄIɂrC~+=n:Iynn_\BY/gj9H""]:/‚H@ #1Bxd<97ƀNXkXH hhuGЕ] H$t NY!ɟW'Z݇vǒc .XE׹HFJwDW_ U@*piî(:ꑷ.<;#fxutyvIgh7G,a/v3 $$%|H \JxIvFI$Z֋}t9e' }?qg3^V?33k-W 8M'&8\ZBd-ey܄446GO!&H{F,q%jFS ^H3#O(%P)b"{:M^f9^ v;IҬ!ɠݬw:j5ԝZ\[NR~E$7]@;~ɷ5GVE]*r?  Њe"sŭpS=ݣŲ1ݣ,yE.4A5QcdDj A:Hvv t̒6|4d) /m e}m)gʂ=:k$F5x<* s9lW;{vʼnD,*1&.@tNuNq%.\X|Dbwm!'>۽% -b\v77z<]Hm1f*J\z\$hř G& te qN̮HvAD H2ƓXq8G'žQ 6@Zt'ښ|wD" Hŕ&EJlXXcvzҌ,;;պ&5C,$݈Q}pDHj0dGPqt,qF+G%&Wz7mQF[wj[>Ƽmt>b;͠JUzk9 {xH7؎pnHHVz8\V Tu,TPqj.]@خ(Łt=Q*NŠk@*j؎\~Ӯ9Y R2܎ df o N`_?vDHKmcPIGIZMC A ;‰hҾM 4@R=5@:{Փ9l 758H*E@qؑӧN݁=0 HG@O&ɐPH@o:?01qA`= =vU; @zEJPy2_ij8F9v<ٷ]3%yc.E̬KHB#H xDmgr)Vqx8I`85:d$J-3ԇHs,ܩ!;HT ~X!)n $(J%$c%!37j:EJ؎؜ZF\ N q`|rJf2H1TqNkw1a K,M=bY$@dl/jRl ҅-Bq XqH i%*^|Gz;{;ȐcHOJ#!9'"='R18+j.`iק]N"USw(t ڝ[Ұ׭_Y@vǡkjrkJjiիCH @znBɼG8vަԔ#~vƠ*I:l.Q\Rp=j,0ӴRgy9s~r8b(\Re #v0Rj3/G6VK?CH\:(N?IH7@RKu@AAFOh$:!n}i%ycFv9 Sm9r/%]]e9Rvo!#6ޜ.;v1%H_M'SgH=Y  wl|qiizZ28>%A@\LK>H0'ju,05HŹqW0QGve@:#'w.g`ԩQO˪M->} Ql>l":T ml#︉tܽi0[(ܡUDL$*\YA W\$k#vd׭H֦CN4)Xu@_Rw Sv5nգ "VB ) '`(N+ &*v\-Xڀ 8B9ת?^AJǕA^i߾HYt7>[Ҕx%P]9 L^18!NK,X]^<;(9 KVӐ/k(9 J2a=JR'N9& _Z%"Ū+ض"rpXōH/o&Z݂rqd5t(RN i`@A<$7 TtxRH\}G"pg"u&Ч@xuZ1SC!?D!#f*J$?!_T81qϵpV%8l޳25 r/2E؎])Y/ӼdF}d,@$bŠ+piH aAuMHj ]k>@*%7tMvAo7R#AUaNEi`q(;y Q|3AÌ]͝ʇ9 ,ΫlL!i Ҿ>I-Cޖ?&SH?H 9HFd,-5وG4N$gɎL 4kbiuW@Q((Q\ H7 p H/$E}Sܥ9sv,?6)Ğ/H=$!i4pɣCT:I*NLL\z"@E ^NYlt\SŽ#sI]JIN Ňa'FWkHKZbJfw%br^!Re? vn"y7U5\[Iv>8e)H <5E/ ame/xԦXp~@H0'Ʉh͌0Z^1 /]ja yqH^uF`DH0RGH_Ȳ;6a#LB*k8HЍЍb @"$5'ZGPTGD|;#,c I @(pq;DYiRRÓb,%x3hRK&zB=n9vz N^*ĸ 7vN联pU1\t?Z:=`Wae٥O;gvu] CuBz ή3{M+N/YyLb{8f?}v^*.0dr2d8 탓u( W~lj!/5h,5H #.8^M)}/8 yH/s8ɮХ3r2Xwԩ2p?t(svFj[{M{(n*8į" S[K~i ;y1;xW$1]v@r1\IoH@r1\VHk8(EDP̥HWX:3A ~dqN'^T@02I $fYvz iwevJbH50cIX&($wnz2^XE˹X QONYH$nZ6 o2ʉG7m# D< ~x=KuUϣj7Kgy!Zm8CsGH^b7^v6n*ga⵫"yWW ?O`\hD$ja> *!;nՌm(UKm Hv<}IRHie׌qf=h܎a;<$R9cti$F2CNR\3HHzMHP }J黷 $:?~"EHD'|}s-$4@۶bTqD1ٍ4_ dza7Hle (;3(Q.%FTDD5(6jX) oCž[ I:爳w 13L"'I5$pX8%TLUl̬vzM;Q] ~5U 3v+ 'Dz[N!1~!~;:0iM(>xK$&s-.<3v!.=#P&t)"9c͙,'C%@ߡO@z݂Dz8o} HfcH }{Dn#AOS4ӯ] Ӌ|&*Re^#;}5'u2#tY:aHrO$OoHcs"DRqw#Ưvhw>`K*e^6nNfM"sC@'"] QF]"a;W9LN6\[ I҆,Doix/%"A@ np)!t.iZ|BR1ߌ1&jlf#&uK\fDs^D2|1zﯜX.=p?;sLmyIIHt H+}U;\\ZGE5"l\}# KK'z"Qth4d3lfA&AH %݋vI-1ooj6g9 tF@yхo)9=[XE}eMI@BNMӥo7ƘGθk# CFJ{Wb%vxҦ.sxJTf}3..\W.`y͛R܁v v9MMm >+=k ҈YhކvTxJ۱Oo@$B[=*HRv, I#nLИ:`1n Ӎ5MC*bZ:jKU̩J:uX"bg,Y*Y/vQXo;[0Gy?0d)MOO q,H@ẓy&H,SUsNO?FALDz<~ii:~|p;,:U  $:)UɻXAe<:hΠI>iQq Z֎qmUZ:$Z͗HVfR.w7RQo9B̸@(z{} $A.7eK)_ܔ> ZHՕW֯JŜ奁B&TXZ=H[5D~#715"mڅv wiTsbQ}9!SOXNع9<8x߷n7Á")0Ht( vVl;_ 'XOHGi v|8Xf >+t Z:HOѦ<}rróNh'r%\\,q}頕yoby7l ^3NID9ľ {$nHR|| f qގj>>E$I>MbpFcFĵ b6th vR$z Waƙ37jj(Qb8Ɵ~߮_8JHZ,0\Pٰ\VW^RQ0Ĺ)Hi!AA,<I3.L"vvC }=Hf8ZcBZWLD`C&tUO*cn-b ѡ$(q?Zb8( ·;;M[@br#Ht; $"U@$F\s-C㪆Ny"U\rq~g X~33qs3c }mI?$ uCNI9}Y)Htyϗ6ޝv8o v ֭B=O KK{cqܽQ1rxG)j#>~y 1/x.KGJV<%4Պ}bRz*S7:]*^xtX ԁ u N8!Au9 RxkG vP1'+Y}|0hҒ|+}:d_[EKӓ_@3:0(P)iC7!mWRYC$s7Ki5c38<6cSAmϰCPN1<)$n|4#<@RZu'sb Y@˱3(u>{+LTDpwjCJ4#v=Qk,tDƶ攝P=DHSF4jחScyo_YORuH$ax H1I D82uVR>4l$)(PnIC[h J)̯=?<Fߢ)yUf yd&%7+wL^=.nZ:hȌ/\9GZUo5]iX,1PU/3lM"0:z HT綃uCI( |dsJ gP.nϗUMHNՔ6&j2B l1c5j++nIO_ jNi6ij_@;ꭧѵyhv}s_:bwjRY4L=H.͡!Z\AM$5/e~i7k  F2IBr=ASNHq7 "KWen?КY>M(?JJI{EYOIXsʎZ<)n'?!n^B6RKJZ>Cd(#wzBD??z|=^^>y!z# b)Q.kZZOc=g9D'΃Q(u'mBR&W5O ηrx$!EՉ kQ( Ļ߱LJ66zzGHwkƥў-J6Of4CYg'ỤYKٕ{UYP:⮰Pqq jrAC:T$T-2]Qv7 .S:Kh1)'!cǜH뤛!LCZM )ϖek{M%_^3cbz֏?r%IѵR֞5t<4%p ; &] $L< zԕ(TwRktFvQy#8Ѻ~4VI*I':lO,C+!>ϝʸ@=,&,op%Уs_b~fhPxRTZX8\Aa֑lg}}(x|o8C=|Ѓd疈P9mxt(! OF>Ѿ}41Ԑ)OmzXD)UbvJsR-D@HMzNOأ+ޠEzvz`k!}[W7HI6FkWp&n$,1l™{Q "zh­wm@h!8U)k8&|T&.(ȼ ꍽ{0o}ꐴ,"?8}HH-_N M!D-][y<ҕdY EU7 A7 pD^8p#s $5BLZ]U' "}nWp[Sh F1VHhGO>yA.n% ;\ $4l {b˶i a( WP 7)_=8#gf$K vJ"5XA7߼7|}#bO1g_vQ?R\\/-``ߗkfH[e qb0=/$ݝxqřbK)'iw\q9M=%@$&bhpVFl[vlHc\jm2œHuf‹.lv>Hv^DE;wjf4&6ݱtK3@7@j߱dq%ay+$힍{K`K"20q)`R>%Tmθ) G-'!utgu]CI͊ "^YHL)F8q«|׼5LEPN $7>_zRJқ.c-v|J@ZI$Lx󕀔PEH&4OifGز/iug_?ǣ86 ouqk?U6狛Vڦ_ؾ᭐m+5mSeRU{)P'|!)P "I*{9DO)P9FH؅BΎ$\CC[ҟ"@b]I@BDIȿ"33H}}4l=&&wU.t;iҁd0}:NGB;\ $T8lHr $21 "K.IC6\CQm)5iO&j<gFO! ՠhChEy? m+i@CpEݿ n~J4Pv|R%"@r#}], GL.馸n"^"!yOclgQJ?ؓwm'Dr#@Da&G, zt"/N2;2oG|DD:+frƑskztj*;&9LmK7f )%0PsiZMr{@&먔2Xwr&4=:9 4ҹG@ܭiHs)fYGV%5˺32˄s\ڃr庚JHf^F]8!3hy# TU4#A_ˍ'p&>XQq ~¦E$Dُxn3[N>yL?1HL$i{Tr- D&Ċ3~3896 $X"1H`pxa|5FZ*)ls{9 BQAb 5P$ @cI嗷_wHƽm7 ^SD|Bo, iG$& ܁T*|QW ܁2 ʫn{Hqb m݊8{Ig]Aþ&XEɔym $IAh;@|6 D{Ni9Y9p[7L sT2҈ŧ<,'C@5tiGƑ[]F`S뷑hv$\'E<ֹnHSŪ&*xst9;no8r @:v.B6Ǭ q?tҮ6hh\y\6HMrqUt:&JD$)rci`}qb_7mLJ2 =ⱼHHnk $觳ϞI;_$+RMI y H0%oqxm򘐊]$_ VA%nہ zXv m H"{WYth^eC"FH^Å7.}3}b8>)>]{zO .0|Duo'_YP3- ?8F@{|&[ ҟ͊H ĕ X04X)R8 "Iw{ѓϼ*&yuoHbXFs^!N1Gjj2?z Ϩ:`0);q溣udv}oL"I Q V(C'&y.B,#}&Hb "\( ͷEE;'>/ib rAh._F җ,I+Z$o]Wv5HzP 2$ ُBSss!j@J:b[&^ĺSXXEeEF\2|rwe BM!iz_)M}E@*%Z>=0n.WPiX+ ҉;6W37g ٟoPU{+Nx}7  {/.hYH<|^#[ Gjf.Phk,`Nm`O`k %j)ռW@!~oTv> Hj˦cx{#+⾵|LǏˋʆ~5jt [oYJ QI|9|(|>)8WT<"%}=5dS@*($4~Ҝ".:`?H q"Ρ9/C°͙ĉҤhJ"W@N2 L,KK\~ Bvd$[,hBHhWł?ce }J _O*_0)uMnPup05}2_gfA8 c  cođUGGm?wPS޴ϳRW5HaW $PvP@2|l/,dbaVBNg %,Rs&( JX㞐!!gɖBu͈A5:#e2O&D b/,e?I Ľ -;h7hQ(KQj0H>DO@"E]- <@ϔ(:TmW4f_#m6L8K7͸+ه;\«X__ݔW}G);\6qM@N q#Sv\" 4ВH1|/LmLF@[O$Vl!/ BQsTIzf#La"'"a$y"u$ <5$ע#$چ^}9r_HENi4шKv@B_Tsb~~R6]@AC*]ֽ=KQ13BX Tbߐd)B0|M>#CP`Q SLzi|vMHo Hc;qғ]='|ፁtT7<"Cr!sH >G=L>b)6IfA(q;/hǒF2Q:j_]/728H>a 'ٯ3(746(0RDZOɩ&sC$<:#ZܑHy$TX ʾO'+}38kQX3vruUHHr%"q3dBB!zJ5HVU=}Z;z{pP@OfC|7DDz"bIXJ>A<ʾC7o Kj)BR }Aj>ni8D>.j  H˫oGW@W>*)d913&/VIPT)$ʵS@7R>*_y3d@RR>#e|9"sfʗ)dJ3|Z9aB5Joc Hv<F7Ѓuw'GvH_oxd'Nw{]]samhtkb39k$*ZC\{4B '˖jͻjiɋ#zA!&o6,wFL˙HQ#w3Qe' ' Ѷvc,%*#j4a冣.cb+|n82}F]tA>⊣V늣V摺j rDYo_5_.nݞ벭-g ɺj@K>]G iwN;!g젙ݚZήqԯsqas"kQ ;&R|}b":@}$Z#QeJ_ztx 큶 @*i+57HUP٤SZv/*;b[6"]qYkqUůb`AA?@P MRWDm!Rd /%sgΝ66̝ms cz3IA"[|K^` ࡔ睐@ >$/U$<_(j <1J :v6Y8.k$QΎ嗴Oi1t:tT[BttAǥ ȝW#Ul~?}ί^ƍ۰SbgObM8+]Ibl\m T0f;]INdf+ b;qd)zE1ݝ7]Iޛ%I>vGҎ5/yA[7+x&G"P0u+Gֲ*^NGF/0<3:&zV5h: t)N0A:WOen wx%|~ 2ST*T@}+P ŅEsvmmm#ΟZ3c..]H =7D\GHwE(RmH/zG$H\zNh/V/?ѧ2=fXTBΧ!:RmFJ' !?WrOJ tnʢ=;uxeC,%oKdIH槲^nYfq 3!h_g8 ̓w1KnC)$k h)My#oJޛoJnT$Y"X99jomyZ2Ust^Dv M"O. (C+`HHg¿>U 7|wOHI̮!T~k?7WƇlWаv>fG{BL6}ؕȕMx|²4.2$_ՐTicN3EQ$ooᣗWw;Q0L"ZQDžAbE&xL罠RAc4ݬOy94λߓ[dA}klC> gL>֦x/8ʣysGxv2m/UFg3Mɪ?QoWəyFi5^#=h޶*rwL|k<.v$ l[>pK;g_/-IR +%jS첻I2`1^EX|b.'vaVxvy(@` *l,ۅ'\.p`Qm>uM䀻}ٵ ?om\#cƇE":+|g[%!t-s-m] vE]S o;׍4] Ei<.dM%G&W8bh@<})Q~nny./"Yv*eIR)Hqgۼ_Dj.jSQ)P)= <O[ m30٫"g#;5:=ei j^r~XJ= y("{<zȊ򕽐2qZ[)R}cXGr#,n='%8;3(i*'69IϠ#@bF_΋[+^Z%H|b'Ka"-g@ }z@;Vس$kH: B[GGG[/{u]6Hp9Rj߅WN(]r.thgN63'!8 RE6  ! R_ڱNvl%.aǩiY hX@^xe5g 7R#̙q"j${t] 4ijτBsKZVUwI뭛rIXvIYV [RQ U7kkosw 'lT(M!PH :Q@|x^GftAHp@XJVpxH0OxYE'@TJw+L: 7=/J! :#9TLbT7tiikϸ鰨/g%vvwr[˰@Ǫy yh`M}\UЯVuի&Ӗd:]-g?<7;Khm4tzYzɲ_ = ~$@Ā3Z*اl$wHQ \}>zDERXB}v8`uͯ!6|h mGO<~@5lD!%AC$^DZs֐r|~ ~p-8ɹ\_`4t^!f2K"cTA~4{xF=xCPzd!Id V r1zƎSl!&k>taX A)JՏuyHh´SP6?Pzm| VxjG^=z+PP|nRzXzj7x,<}N~g[{0b; z]^%Ke QcF % vs4￿q87A2*&NHC4GHқw~xǏx~w q~șՒ"ԮX?ÇWsBFU"YPoLWcCuYXk $=MzA!9!U/FݹVH`>vȑ掼vG7vd#G;1yuiE3a "AC$6(SdV$֣pEbPZ7X6c>{R^ >f( pW-? yj5kHsI?}cmWF$'c٣ $$GA2Hd4YT(n0H"k6Ԙ(FT =FB,?*e9,~wH8񎰥43Ll$[|LGz:ni*!l^Th)O+TFFʈJAga\i/sL_,Lj}!M XW!QhHye\"^W1!W" 0pO.=M^NrJ^>'n8౨Vl^_~ 0;qfL`pggx>5%uA'[0OH>$ @B?p5> }{ӰfJt"^r埖Q ?O|H{x]G=j 1a2íjWHTfZH\fO)qɺw+>dt30MMZqg1o__Jވ0V0ijv*cKۂ/?{Ƕ}bAAmq-; p{w[ZnhPRehKh6B-u o@R\ #kA]fo[qۍ&z^PQf&m% R Ɲ<5͘Q.614WY wG7#Cto*'HAHe: hm6A; >w5WCA>jD&ʯEeΝkAYO*E(.!|>`W"mv./^l&ŝ]##E.6_G؋昿"ׯY yg؆b*V@7^~ p84DJ<QqfH  Gx$>b(tQh={݂Z)<)+ 8awY%8&vLJ圪Sq#ajO-Ɖ*ѭHӮqEe#*jx>/K^S"ͶlUj*5Zm>)1wfv: b ;3wq;gIihO g3[\GjX|{WW駯=Vo_0/|x'RY^ Fn1 7ơ9uU%dQ؟ɠm& *qDQɀMH4m8v`DR5&`_J@:[ynKj}IuX!:>ǾxO9_؊ ); !]u,{$rt9ELxS.\HtΓ͜SQ6w9u+rNw|>qS/"jr57_ 3< ߪ?EEp=|p߮ Q]-R#4UQ>'"⣼|JQДaл*}7H*B8NJ-^VF(G>ݻ|嗛.mTK7G·tEnh_P7 ģǐSٰ!;G $w"QS'0MK`jd::@׵mrңHAB/#MYyEeCE*y t;.~L) \aL{ ChM5 "w· -zq/W-V8R >c󬸃u rR,"3}|Ye"BD\D^eJ-תHTyUnuysc*_W &KݵV Q0"$zfކEmKvTW8'EmȰ ~mёViIAi8NtQ5{C pS؅ 9|t_Ú,s!C(Se C?Z @yKB^3$Ţ!ԋJ >3yR0#H"=wqO(Mgo (S ~%A?.Ft i՗6ڋ].BzXhE];ZK3@hMz^o G .XٻV2U#ud')5ymkxptUkN>.W\dtxT#wQ}F {]TT3z\TZiGT8-h} IwC{w"Y^} Gw}J{.7 |L໱o[VxD~BHJg ]50wOanOHKc4&@X  YW<=TѺ4H (UnFr|*)̡ :1kr30}xGS -Svw *|!`g 9pɾbWr!"NO?K ]y@Z$A%,Ȅ67 A+dH].(Ahty#-DutslG eJ AgHg@ώ%Vŕ=rⲾY {xV!'>|R}\[W*=gB s&*쾙}$@4} $%ݗ!I,aI/h=b}M]+6yj>,xӇی+qZwt|9+&_ HMsul҇Wq>Zp&#'4>ԇ 4(lD}ⳠwÕntMDL$NQ0^89Iv̳>GyKIj|a__쾉>GM}5dkN}zQ:9á ž8PqoXOZqDC5o w "|2)4|FU|23E`"!u+QQP'ݹAi@?y3.8Qg]^W:ztSzml H!}u'xtʻo47$Hw7x$t0Db0HOmmq֭/$Γ{{#"(Z(gw40H@c]m :H#&-DZM%{ &R"hpDDbWvS5uWCsSC6_V~#i.r,8.us;z;~>ϭ*_Os|}p3_!w rF@ ;@2om16[ $P7Xv"^c-̇]"ҶF<7.1##N{:{qZ4w-C3@ʦtmxS(BZs>(x 4,Di/4?6h~( VZ rÏ,&EQK$aR 3gάт459NH+̠gnk<&HA}1-B;H Uf̣R@bYgUp<{=\񎟯 {55y ׽ #,${ʎ}@2}MّoaSvKpU׀p5(D\u5G[,H8i"G5GBӮ2HSȷүu省Ş.Gi?z]Uס#1dgMH&Sz**l-`r*%ry1xRkӻF$ZGyN˻|t"T $uo24-nHk@qEꫡ;XG`o'8i\%?Ns]\]_x7RF:&_5@b_5@b{-jC.=@]IbEE-ٔ-aD N߳L8(+39 dqL;Gm=tB&H+LDQl! ٴ~ 1T|%֖6Xc;v( 16H۲H?plmIIih7} 7 1܀ۯ7?G4^A$glɖVع3>&&'=RI4lD@}2vXiHH ``4wq|_*l>/$hHIMRRJ_ȅ,Zd/B@"u=Աkq{}8&{v6z[eM~qA·ta ܻ}/ 6"aXJk*A298jw7U'||LFN;$ڸNf3wA[ZS&Nh("BZ]&C/$Rb*Q@1dM#ߑQ2w NT81yfR\K%G! D"#IR'8E4 @O?uFރ"r7Ϸ eGE<>wkEE~ݯAb5g_!}UYE|32v~aQoEX tb qY'Vlx$(:|\X؅/lun6gAm,GL-n=.G wk>v4"ADJ;n䆡gw( ͵u[5[HZmvAmW3ojXNrJ,g"y@cϔ89 DrkCRtTƛ"j#n;ON~P@`ِH_7}A>).ψGee8OM)PX?\®-F&JWl")_ib$ߑPKTP={Oҕ8Im]7#=]HPS>3"T> Bԣjqs5|#v<שs9n_EE}`R[V^m;2.|'cc1(–[*}9k9+J鸃jAQMl R=RS7a^u}죜8OՇR0#c|KG! JC1SF 4ɜ߱ү{{bNf?PdBlJPM_2d>1L_P~}M]&}$E˯Wds7H2"΢1:+"efC:GSHlYgkoG>buVrEy W2ocg_&ooLqy [-Π=k"*>R Tb(qH]+VS)Ĺ-H&hWk- PlW&Lz I E 3o/B@j54b@P$F>mHqaGD E<&@{n/5-xzؗJ Ep y# Yme\KHKLf0HVz܁D);WӅvk0j>xCIHM4ꑢjŻ.V5-Oþ/; _~S<"D"=J8o{D" Ay[ Dd7?_&KlJI*_$|Ey/HoRs]$#O/ddRb_l~Jkt<}lΘܬ'b]va3 }-Nj/bWa$-m_:7PRC,G4&C~ &}F}|%B Wg|,˧f9BJʗ V,|qJ)!2}-e"pi&56ְ2EG_$$qk,AJ9bT@F|DtǍG zX~#ؙFxrI&n6 rmH)-Ew3wruʾ|JAbn+xD?{Iy`3'vہda֣+܉#͝6}ZA$w׮7EѮ_sQ0Y&;( }(˦~uhdRh OB$c@!- CQiIZHZ@z+x6| Rù1C'  ST鎑 ўP2hHMs:^P$us{rg\|ʾ\Iir G9񨥺 eY//_`VԳMځ4r6N$o=xTm@Y%~#C#o m kΧ,_؎M/*z/TbLy74@c@/A1@ $2} q3þ=LP߾e81%y| ` Ew eúafj =G=4X#tlyuz;^qukõ"$GH!9-dw;i'a*6* .u,T^vSG5*HSv>1tc8Qɦ#]^vxwE/fLgI"MHI 0gՎf$><~$TnI*4*x*^#U FRh/z@e #"e}r~O_~;8%B8*t;q U-J7b}"O] GdhҚPqiSnkXj-LM :Ne";<{L&꿶M~gsj韤!x͆cG npѐ0;^m7;&C9|} I2>w(1AǠ?s~ceUnccOF=4#HK1GK_ȩOtcHO 0"$-a4\n,ͨ0Jܠ7|{M^Pޏx&%9kkunA஝U<ʻ lu<T.؂98OԲ^q\4#qv3e8~ r_Ūeɹx%h~=pO(R*ȏ7B67w]5lgs /W\85Ơ̏~ Ucg'%%5s%)V܂dn#7p]:j!N鞞Ex-xXb.4pp25t8q29qa.tOs"3'Wakh`(g sX=,?~J.1“w?Y)pygOБ?CG)YT2Y^Q9?T\H 3q5%)^?'9jnQ~HՃ/ضU?<"HxBs"%qgq5a? lUǷĜm_/qFKmQFj2`AɅ{N"vP9c*{B<TQ )!]1jD>kc T4 +÷h[n _e~ߑ G:[i 8:pJhv BQ$W,܌p7P"87ɴ$7V\{CjmMUV*UX0g9a(ZY&J,gUs 8jeؐR,W(GAtВ%gEILK5a?rmVaJ6łB3]ںa=mWp~TRܶ _qS^緳T ۗ'b|V8&l7GK\ε?$}8 5`&.8CJecRƴqgH WqNq#Ŧqv3$q0NsҲ 4?!6_ XqðL磭3sK I7Ɛ@IJӐ%CmOa oZMZ0N70 ?EsI+62CJ Q ̓)`-*ˌ0_  vA\kYeH˖[¯!H[T&b*#CJrrwyy? HGF%HɐMڒ3(A{R.JG)8Wq%H)ba?! *9_T%WEfCbd Xr10OkQ\3)`HcQ}#xFkHc6!-+v}XIS9C=!Q9MZNyQ~K?^VWzNc%~tBC⚝ƐӅfӆ3~dBq\#N#ʆt H\eCJؐ,eKt1Cb i wPkc*͆z3t;CzZq7AZaƐB (TƐ1$2taOu.;aGq[h3GQlU7!MwRQDz%haS i4Z8zCz|_Ar'9+@M FqULȑ"p3}ttz]tY~7kѐ(X$Cb}D7U+;쫛5YOy_D%k,Y^yQ+!}:Cfd֓!!4lη#{y ?}PˌQ!]4~QSvA35T 5<^au3 U/|K.Na]!wL:l)C^`iy1.'N6S;>%hē~{lK }^9@!pi 4yy?X +p"GD+mW03l &9dUd?(ȦqtB0,JӀ0[) h%6ɀ0qts=vz FΛb#y~-F/etΐPhH+?!u"ŽR;]Ѧ`G04(WeїSͩ eHum[sHuۮcHpNvy s6D)ސP2+r YPS%sΩ\.7N ^.~5.\9E E,ϳ{ ]~940K7?)qIIfG.\fi2 \(&:CKHjZFfZ*t|3#po.pO=MKc7#O33C:B$a~1FŹu':%H5ڣ 5['V#G%1aeHW )K%;E-V3DR_ϟrAs~[OqϷ[D*w5H$S~eBVE0$AƸ zqJbFFnݕx'h;A qY*Ti 3p-;@輦;MOZ8(pi4?m5olEj1XYo̅'Z}@!<)-ccZ?a iu8~|CynPn:l=8{S.f"bʈoTz54iW޺ ;;R4bH$XXi {̹|>^$͔&{cܵ[rz]M/h,[ew1s^f[b-!zt'ď悝яx?j~w';`&o#Kő2WQ R8Q!fHoX`'׻t\$|8k]3Q3nŤä ]rx(1? G@Zd>祧|SS3h}..wjhO(Z zorkӳrN+>Vc0+,;~xYߙ DO&H`#Y]R{;j WxkְK?\V vёWMMx#ie[4MgzKqVSsBl'YSI5oSxG*hY<9tO-EJ`dz nr\a)_t #!~1iA#󕮷\ON9v Qԑ' :.-^_*#+,O-bz~dZ{XDG&U, _a;yl"G#- ,,sRثS5nUؤP\ 5^-6b7޶oPd̞Q2֌<\`ʈzsGbsYd>"h><2 biiϘ Os$~Á### ߚKOxxx<1j68GG F>tImaQUJalb5>s_DĒ2~ؙ.ؙͫ. <[o&OХ=h_?SH?'4roo9{<2}{=>qKZ侄$i~dB_P8ћM o_@~dE"_TTUUDڑN2YluhQnf&M|H+Rxˍ0H@PDx[65H)πOO+>d>yj?}وI|fyج#eo޽2j16yBb3T,5ǫU+㕌UEWNo\h[f#)Bi&Lz3&z9Bom6%ؙ٥흙zWt+"y wAQ]g2 hp1~h!582-ڢPWNLLGtĒK2.);H4bub EJ+i1I;I3>޻w[LRؽ3w+{s>>Wy$`7v6.پ ڴ}IO |xZhg.WS&},?ڋ *T'N?Ow25ٹٷz`!%ޅ Z8`4􂲭ReZ?>+Xk]6OKF%q_݇zΝӦ-}잔)lw4@ lܶiM!#/{ZWc۷/۔&Ĺ ^~ġ"9 Vuku6Yוގb/f.Gi*c*C {*E˟jN셡TA$ Ѩxpo$%&ǜ† ND*>,μ+HK.8r@9hܹf &HkT X$ފ(鶮ǽ-Bs;>Vl訝67SC}>otMܺd3ϧXQmޏ'>@Z$jrmpuW>Y+{\VU( jruP$W IY֍o|fG+?u"[H2$=h3u1U0ѾmQrIP LێH׃b)m;H<KMTF$ _Ӂ=xQr|~Sg93N}ٹwy&u#40 aEk#y]mi֥HtiS`$uuʅ/Ѕ+f ޼y@Qo࡮])9v"$$*ik#zӣf@n#J;*8_xUwxuh,!)(+ȝHZ- \!Igvk@n8a+R#"%gn+p$Hs6Ǯۼ^"8He֢o8fi>=#)fҮV_+;X9fRXףfn[@`ٷ $!.@!>*gOCOm]x7~8RXJ,JBל'rDģ[E@GV ɻoGa&;+eh^2`"j VM׏]zfZ2TG}c>m"×YX}$w>e/aZMc\nӓ"@ yA N}7ѧ-8D#qOmeXK!i׍fI}UԂE}_>ܖwRJ#+\ 5d]irR.j HA"Rc85d{TIdq^N쐪 ) N6 "6!L;uk8 H*WWfmx#w" > ÿ IԶ2GHK?6 UH}I $ޡF(Y ,ݬ~C 66D<.VIԉ-zH)׳cC>xpy2h Tg!Q9G$ @zYr'q{:@ō-8‚F!&x(zQz @^}#^ϙHKb\QS4]6#C+^|)#| "MI6U)u#RBwnH\֭7y*97!fQC[jD '("*+Ԉ0j<Fu#x@Ҟh.^,H?xJhonxRsAJȗXٻ KB;gلSkH pΡ6u5}d@zo9<$F˯jW&"mj$8]Eemy*,}F4,4Uo^$)']k Eb_o/󉍧 9 Nݷ3ÏDCǷ Ҍ]?]+57io>:}zݳA_8S u!$AI"lRRa̎S-̟zd<~ =S+T` DR@R^ٙ4י#TDI PRz/t@$ ̨P% YҐ% RVk ݳv:q]j̔G\mR +@j1ClO5>Ӈ3kjZlZdedLH} x_+ H<ۖ _$%W$$>&x,"-<3{p S|?yvӬ%;V|Dq5A!5SSH%"m+`'mye@eHpEHGǮ!LѪ.ומ4W꤈IKYh DŽ&4ыu1{ƜɝpcٕO8z6/#f=2uU9FB}"eݯ6B EXf[MdqE{]2vTϰ[& Svƙל$_X%ީ).cm"HCƎHK"<2)׹T!`HhoWE2 ,\>oX쾏}!Z ze',iքʠ.­6XvPSm\omZ~=4*Ӻl>ḤDZ9Y '=6ڮ]EO~xM|gK<>ߢgn_=`; %FMhG6.ɫkH"p.|HH/(3>066sEzq~I)Qd4!Ss}ceT4fҔ$S*cTeSene4TֈG E$V=+(iG#HݠN nX͛[h>uQC$vԣi3>᪻g:jBbqeD4p$Hr>J]qD4HӢ}#&(3*vGRJY}6AnAvp!vMƽeZ|": كUIپ#6xA9GKe }{c"b1ّN :kL$-kU>hs8^}7x}VSN>/r(Rs '(s.vmjkoeh̨w#N@rbi/RDz"e|zI${{I)lh`\(ʯ*u.vHH-r3& #n^V;(DJOD:}G%5" v;5 *#*AZ #D.reOhЋOTuM'_S1Ў:g@0ipHDjGI^"u`pD 'Bc>Y H#VE)|\e߇Y/ gwcб?e Dֱ,s#DiW"~)TEzھLxDx9`id"}i5V_C=_uѷVǼC;ٖg3$tx{*9kJ)a%#G½@/ Zr$k!BaƑ<;78&9$Q5^!B [^9O:B#.$ (R2'/|H*Dfkkol8d,Ө b"^ϐh%^ 4Czi|ǔӶrY(kH9zwoҬ߾o$oxd\GRXd|ldd"h9BFEE&tE"I+"ii GH J4`NH d}}(Yi0d#;f%"`qn -r٧\}q ۇR /!MEc-2#6Ϙk/y_#R1 B;GA%rEAm:bp{·'MDb1l@3:[+ТXct>:cʓGl"#C$M_ﻀgڕi##Se#qJ nYi8ޖ RێԵs^Z8(!HT6\GټX4RtYGL:xwQqơ/Yo؀/|cY6 Mi1HV Bi&OF#4rG96  F$diً C`&s}lsӇp.}P2'If1voD*Lx,TQˋzJ"O`D&sh \l7DPW_)}\R皲*"]B.ǐe t&\ ֘xT Ɍ *kή$-HX:1uhgGG@x(< HmAT$*jr09aߌIn(ƏꝀTVH< %e܁ݯ@ !gv J'l<و?_iB$*lݷ^Kz[vY'[ D1G u 1~!BB2'4x-a(ڱ_9lxKe1P" u'ƕ$SSd|D&; G5vA^;֐c9=}=RaJjLYsLs{_di7@$Ut:g'pw}(c67 HQv RuuUi˨%9"yzP/UXl%'o/pZbL[EH>|sx6)X-$'ԼW>G2TF"UMأ|8>8e,I@94y%.)*A#G@z sғ]kVx %WcY]X\uH')hI` K||w gzt ~L<5om_aD'uHWeD>X>h]<@Z'g48ynw扲H:OvPnM=!>brK'>Ld'M@e?i^9W.O)|-N@j!߄z皝4rRoƤr&zOΜG OHk؀$ZX(𰏙Ň>xr#} "AgÙ7^"f f<2 -PC,C__7"8E^Ve7M$(/>^£κiGRY: =EHξ~d*";1}7Yn|{ _OH1|"S@C 1|!O0A!҉6CW$v8Bģbq !$qtv }{ MV) m&Z+@1t+Fa+ NH$c'O@QH;Re`AM25ȕ5$!gǐ%WUHkׁ:@hд^MP֣vaɔt1)<*3th8"N)#BJĎ\t41=D /PZ5B*+(óA'rDx܇~2xH*#J@H2Sv |%H&iB5MBE=HSv X08Q P@>?$}~H!s(Hrag)շ}d+2|KJ]g^;sݳg`'͖F|-+ǤtC@]TvE+ɪh $Yrf=cG˜*;'"corO@.:&>dHPO,  "}(hڎ9D֠ҹƤNH]?^XHBނB j ! E 'eEl@ *559o/j A Jt5P$O|h-~ribG'\eWj;_ޔIa/YK/sZ If70喾Hۀ 'xC'x@;GD>ktX$yl ^ Z6kFe66_Ykd#"H $Pe6zEO$DLgnN_8>T|wB#b60g q}z~Zؗx!]9w<:rЕ#EG>4tЅHPDqT]T3 a'tHҲD yDMqPs<;Zb>_$yʉG&*" H9rv qn@j<#FC.$'+'Gs<9j #JZ5x\ "D< DrHDUes"Rd$dKm"ǶiącHӲ~}v_sޗ:ghţuGg6knǷ K/ q&yDDA*> -EHS\|/ mTL#r'UM{>6xT<}g}ICbq\m%":KKrrСݷGPɤZ_Ξ=}B񑩅I$&m64 Q@]8re ҹs] N3Jaϓ9"؋gyrCJC{_^W=/ɻ]v_azx|VlCO)?zDbqdBAywM $Mb"hKH.C@멘)+I#"5 mKkHs}/^PWODz|)s?$;io#H2#$O H!;` ͮ?wP+GDtЉ8+ E;B0;LKy1TB$Y(y) $"yj` i>U1Ldk̆TT@TTz>@wر6URO@ 0zrG˓g7As>5k:E ~I./eAj7&>_yyDڒ>DnSV45Mq>gELD#$hgi xK@'b?ܓ_[,f̌XxReqh ۷x AN^ׁL@گQ'Ν;1ttn'2%I ؈ѢGÀ)ΊA\ N Z'[UCVX!F5D  UJ4O=RzY H^nc+jK.E `ԘP%ʕ@z*IQdמNc~>v\ԀԠ\ .rw2JNIH ţh'>P+7Fxg$,++5I.Bo@,]t5hB'Fw݋~t8MQ׋DBi! k4$=BA€ GH>jeZ *NN@f >{}Dx itؾ8}'2xJ$x$9݀&$R6P7ʷb"|MMC WWVC(DJ%rj}1 *R7Dr֩(±;H;%Kˆ"E鷢#7@zܩH*A@B1lRЕKxq$HHO"(zo1HKI;=HŽxF.oH ߽ $3 W\@v2 "j-T6Y;,h/ ;) hgSr dlz)Ѩ7djqԄ@ei2PZHHU6e6[ˆ&8HgG8*BS  7#:>DC(A@$3Gv} qh[JAU>Pe( $?pBzK=(ssۇ'Q*>Xvh|Z; J t=зp$ޑni#L#}ZFpaF`2uF}3|f"mIhbf]ɦBd* EDڗ@)7i}Hs'ҧZ둲'SRIeq KA[kivy !aC'9 K/:I/-Q@:^ߖׅ],jk?T0n_˖DU]8qD" VG4#c7K1~}GtTUwy繱q{8w,$H$(=t/80U)$hnb`X` [i[\t=)g{ߏfzpR&D.4|Ϗdmق5yqU") ,||$o#sLB۶JځB,>׷o߾ Dz&ׯ/'#]O :F}iXMuXW96ӗ01_/2*7D3'k Hb>_%@H}8fsG׵;GJH(MwYv@|o3'6˺Ѿm#mNu 6 KnhHѾDKҮ&C6K,gNڕS|L$u,q|YݮSRN`RvoAo_d UE@@5m1 eŲHR@:"!H@Q8 _D1C"$R>1v/zvIlJ.#F0jqx?4R+'maqU^Ͼ*eRh*?bT$(i qwRi7Pn:Qz}:v[¬2nʈ)D70s__ oo/(O4'HX%߸CgP_L"fw2 #Rh>@@b߶4)jYװdFfoWL)jYPm_eI4 HW5$$&R#pC @0XMW{D7x@B.(3ԁdxXH`ѥsb =ew~hwj#R\jLMmFlkHI!dVǻi.(,+5($[-*ڸq *)0ȠW%ã@}b|/YB4"!$D$HkOG: s{[K*Bv BezTiA[ө΄$+B//St) Z˾I@f9q蔏b-&8@Hx:դuch≨1h^cǎ _N'~]>Z:9#,Zp߳PZGowVii+{e$k2^i)m5G"-\?|h?KM#o[d|#M~_hwF0d _||"gK%ߘ8Mukǿaz,bXs'RkGeb,=Y扺}B[^0Y{|a-E]W,V #j}Yv[_%if@bځGN5" cȂaPLҽH˾i>W}?Lm^bvD\:rhx SXqţ =e׍.uvtHŠ Qa,cײx-;#XI_LYef#_YwW8ո\HcWwS%GaݟF8T ;ѽQ{Cxێ _ɗ7zݳ=T|LrjS|={|'Z~-}>ДK;;PCqvp1BQQ5B*+(jGO܋p$SN@}/Ba ' !֙8|zzx &\@$|߁@"N>Zk9|e,3Vq_Oˆ B"%}`SB@jVf|`SK.K_QT$}$ ISc}<lEk=S  <`vsFD >DE^~7{EշA 0R } 5iW^@r.mxC6\GPo{ҞtѓO̢Yt($bفD!Ylj;pEG%/ǥ9BBN5zreC:>jH6%ϓJ>mEb=ƹ^n3aYWUm7ߗg@ҕ$9pLR tfR;TSDH2g *4R1B(}RQ9>8h@@7뱯5oQ>AǑ~ਈ."$sYZ}GA!<±HV_QPE;:[wzɦ:N^GsΎ&q77R (5i'U&>/pZ D9&H[{v< !Rh|O> 7{@n䉰i se(2U3I;'X]ylx1:^j|,]3uX@zbZs{BR{]h9##xe[cboSN'x|v׫x?cfYדY\)Y)YQ"! |!! CQG!^O6}A!D;?T|K8:Z']7_DW!_MS| r.>aGa_=z;{ZoͶZPQk,7H*;{OP1֣ TP+S0")TG5Z>4o$5Ag\Yz%7_[^vd$ .tŗajX\]s'H :^0Ү kF.kFڼYR]e\/c^KҮY~L×#~3,A(ή[Qv"%-BQWw,'@$5ijaN򈁄32:RzqN>M@"vI,P@-[Kt]4 NV}£uwd1|mTan[^63%v7FAjK a;м3y񔔞.ؔR q֑J|$ϴշ%q}D$l,ƄY(*|i#' fUƸO #"> B]Ze宾|ުϳ!>XnA$;x{少Ƶ߲mSuef޼u,!Zl|Wka$kZ֬5쳮نaq 8H/7l]l<뺞Y,M?>_U(>_MC|}DR߆wռ >w"e&\cwҎ}{:{Mk*F_}d]B>/Tl>'{gUVJk[6)Ph+lNP)E#Sm]+ YC\DVYn*Kq5R4Z4ݍ,YPIEk~<;%igsB۹?s#|}^GN#63k֜rWk1)ĺMIhvʝ[XGvmjk(?Wuw["u?'Ձb<뱗$uohhsнXj YJW]Pγ G:* ;XHo~Y=B~D I(w+*hKDusPmw1v1 :%4@ek.i wCw咽w J5w.$TyN"Kn#oRa}5y&vչyBj_w^{ejwzq$:;r0HH䐶9@bEm:_iʟh2ʔaxބG{'T9 >Q CUzHyF нA ]~G<ɣgVY92t.)-u?"GDмD*QV'oEqWU``QUe%勡Rο<7/E<Z\MVсݑw^OOq?3|r#9yѝ;wB3kv:B3ar[+yx@*zwDEzQi/uu6)Z-_c"v7fu])"x2&Jq9}q|BT{껎xC; d`v덬t~#[A[{0|,2HU&HjrW>nfUEE#ޯ 3"Lf_*aؘ_x%j- RMUn*/1R |r-x1p_߀סGӛ[{n_׃U?եjVA'ΦqjMaDEY,K)VGᑯ|H(m-,HJWpOWn:[{{ԋ;f\_Ղ255X8֥Pa$Jmk7Duy.ʲ*N_eBGJek-/A--=b 7AS]ͬ=ڒԟ{Zg!h脒'S|{Ql`-"#Լ8 5k ]B}j1U5`c Dqq8RU,<*?"wY(2^PAb'YY;ԯ8Ījb;d6pk0gy"fv}iG8UL*ڱB<޽i\\4R+yi)܎4E++[Z")E}U%![1PF XE 6DzfMɴbq((-/˙gf>S/$6<(mh UGنIIeȧHW Zfd7(+62J0P=N:Tj5'iu37T]rЅ5zu7E"y ݦ W''}돛Ϧ( KEeB?QA|b~Ѣy&9Q_Hi,ju* qmJril,ƫnA=Bq%ZT9);)Ӓ*Yst*uʉQI+Ѱqׁ663IxQO^Ji^IS>Ds:H2}eUE߁V (7L 7בkYiR8]dqlFu/IJ&kݡHK]F&&F@$-bْ $[߄_&='dl}cwFv>XX_0RRy\ѻT.jJi^V Շ)Q˨$V5jk t*+(B̭1kd(L%jYTEX?5TxړJP2DtE@ɳ# o`<;呔'@q#ph|w[X,#9DZkaaG"Y&Y3#CYQ_Y2Bb` 77BDgQa$;, }o*#!ujuU@̑YNqW0GEe`˲8bT HO@A>H!:DDdHϤ BˣEsܬx^F=Zm^j<L_C6tD "޲Ip֭[H#xo[ uumK9pCH. $(SN! R-^t=p`60U Y#\??3#:sS~ΰѣ]荣A!ޣmVZCEnNJI!*n5G>fOaoVH+ScYT$񬞝O`œTٸC8giŶ:1H@)}#Gg$#D8:r 2F# 83'I{[\>(sdQ#"`MK *SD I $`@b;+ ر!J.ʬ('RuH?k\ WA%T5ͳz G$-U0;h̋ F2$3kG-o>#} A2 h*,e84̒U6Ecn:R3y#o`ؼ@nWk߼V0*GiDidG $<"33'qR<1\wՙYԥε"s rtOFq4ʳ%Tk3!N%={B.xFyW_C$byG~Б3 b܊_9>8x`n4~QY# tDZ\Vd!#Ws +&V{'L,ͿU7]H#{XL~Y/'d@!'X{21b~pwzK&R2p+`lش/t4H%\]=>B6pH-ҥ F38/;H pKH;2&I$3{ɀ +D F:)&f8eK|xxd猆3)Dk3a"k(ȕZEu0H:?6w~skA-]9b"a@-Y蛊<*C@ʗfB98ȗ@£?)rdgG쒆*iԕ4CaBM6Q@:zAO|<‰ U R:$$` Û{]AFtIV7F."ʏnXdR GTX)4wPK'}}cIv*I/}ɋ+J#(!C-DfؚuxlLw u « ٚD=tqb~R]CFp 8=mKdz^ʞЅHղatO$#pHHE5N@ZۥC6va ZL U+g%7Ŕ/!2Hr3,FJ̢H#*o"4!Eҧ0Ƨ?w93ԕ \IDATK]\'ih?ͣ:2hhlܓ.Tfv6DO2NEr$Dc$drpSx5w,K =I?k 9;>,琮}d|[ނF {^J틱r8|G{LlEAjŽi)+$`qy;)*R CѯGh# NJHJT@` UBGӊ^uչ?kT˗˗u-Y-9 uA׸Lehn8OËH!Ds)h3==N@J9(a?ռvR QƪAf;<3BWt G#zSH\644`H~H&HN]RH ,It Lb$ݽp8ntfH6wSj m& -Wx30v#ft c%6͞W]> #s]^ZM =A pRG O$pЋ_ܒ N!Ds'S""M K%HH"H_ILG@ ΋iz.B U)cn^IzXlg0 mdr .sXYck._ &-Zϭ$;cl %(Pg︿b\R!1NxkHК̞VgjAH)~$.2Zo~ P`{~x$NDl"A2+C&x9,H܈\ Ȇ_F .B ّCe {NhP)1kwSDzc8>:9?>8uey#px#%#>H$"qЮ#D{n2;0m]f _o\1Өo&饅/d$ p,|@z2x$( H8Urҏ!%GCB T~#byEU]ʒjDr]#7Jw|KD> ){5@ FFFL$n˄B|лsLHtyc7(bP*z5'n;޹5? '=Z$[پ FatҵQCr!K -TonW]]wRy!׵A$+ ɎFEXx 1dW?iqhPgo÷"j؜Vɳ#b ]/t[1@b3{a &&2O/~ZVNAɑ;D#ۛ"I$%I"qIH:LvH.]rÉn81H8w|Z5C~ @rSlH} ;-rb ) NH(1Ve$'x[ApPƃCh4128,~<DLPDrEX H E"DA &.f/#vCGF$]̀Mu=qV~VL ߾}X/cT?t],?QW6~C+kRo 'ۣ\@9 <ЄUOi$@U}ŁrH<ؙ} *==8z@=V9$Eo;y6xKWFT+Z?puHa }Og$MRiimF!EHG8@`ȮcYAgfY*ʾ@"$TnxG 8$ӒٻH'޸cvE7P]v]6VRHіM(J7n°6!4{='*Hos]sJ %ꀴ>HgyVm/7B?Va6>@?Hn23<IE !Պy쎘Kx]ea;Dq,)g%%G u!UH֪˿α;8l5Rs;juIrpKaj7޵_t~s]Z]k$@nv&)5EE&#ri:|7SKYF@:y|޲ڱ?q`"EpHJdD*7j`q#!n)?Wj@r1"4+$xc𿸄:pn#dkeBӞIvu^{D8WP{%RT ~S> RQI*`"OtuG'IܧAj;OWs4CՓ)$^NcġlNVmW/!EFpQâz[%L}obb=!2/CY%ʶ*#, a<ӷ4}#AsE~]T*'˫$bv5z{6d`$o@śHTv"M+yD*{畮R i:QC1ܴáiL ,B!2"U4HxHx56b %\1&31N ٙ itߠܩ#ܓN7o<8u8 HJ o"HpG$@Zď5rY͹!* ~ϽX ’C˗߆A.}CNt T c}$QXYG<ˑ@ybh5h8Bgύ,;Ӧ#-\@1Ap ,։SF;Լ3AѼ\<*UAQ*$z b$ZNu^XR5o(~ /HqH7_9RJтYQ,#9$ 0$6Gn*-+\C'r}? #h4q||ʛEoThEYi6El ?5CuHiY\z9;wW-N ,ҍn'8h[@9$ *}@ZCZCԪcN Rʓض&Uu$Lњ*x HAf<;2y3Bڈe>ED#Is[SuthZFH8cG@friYTDbi ]]0 x#R.4@hbCT@&v#A5 %IE1i*} YYZ Q|r:RhVLP1Fm[~DRȣn &M")e`;@Fh9,¼ã;Ⱦk@:ݥ8x9dH3 B*PH?unHtp$u}G!@ QԀD?#v!2f@J:$$b wH?;RʥH8^kC$V=//8&5 4ixU61 Ahկ])U~W߉@)Ε۩"nG6I$X^J@%B_}yd7#Y琸Ae G$n ]$HCDCareHtGpxhe.iFDOaL:;4=*U"R.ү,@)RMw0 R 8BlINT(-QgB/U)G#h0:=F+tnj76)%>64wHu%\iW\W$ wpƶH{@ʼ@ϷO,$VYuVUꌰ4=)Tk M{xS$)fCc&},},}W!sU`eY2I$^|ڀǘ:BAϲok %U4HXcG*5v %zv>7T}58eCrZS:N yG#t?jˮA[=warJ%&/|4$M̝&I+}~ !ә>U zFj>O㠓HTmkA:] Z T@Z ԏHkhɱF%iHHX%*^G_g" dyAlLY܇$qNgQVw!ʹU[H27yt|rr4~}rbNɻ=}:*TGUj c+IDN!E&>qH ftfE<7Q@v'OxxSO} c@3 &GL$6Fc摙H&2𥜘b1ผH#C렷HH4,pw@]q3dQ- (\F]L@b" $pvSo 95+c[^1MHM60yXiT@{C2$m@ȫjhkk0%{y2w6r#!T=z²  =Kbg NFϿM{{D27W% Dzx@߬r2'F\,n 1L@*eT':7v>amUO += !/&|Nx=Nwԙ.=79$nNјjaqK|a{#WÉ#VMҼ#fSE5YIFf(' olR]İC(b\]vڬ~`XSv,:&[qH\@6vBbgI`Ϝ#\] դ3iIWٱ!6)X_JQ8PrIGxUʟK@}s nF 1 **o543tjF~KOB*7qxL.x۶ "q}]s6-C{99 ,ꎗBm)V:^*uIƛk9biv{k@^ʆGܣHϮ\x>,otE" $AE@˾y^w-I?H+Æ`ob^!#Η@z$$q7\a.va@ZFWCڗ Fgݝ )M ݷEZ-N)Qã'?-!h >!}Ezp5a_NF~nqoWSMHj})0\$c3 $3"&|}hݐ2iL0Prp~?@zY$ l JSC81m UBi{b2#;z+g e]b7tK9;$B7m,b$jy{lj]wnsU֙3KHJ%- w\`t ;\!$[#,m !)uP%Y~g$)c TĮiժ֚ OnCs[5hnƆyy0F:iV_AY%3V  If(iwC嵝,R$D[݄ ,lG|I'.f]O/۵~4r?G?D1;H|f H#DGh:AػB* +\]\NfBNo*oo7fQ>;jMGH,vKG)e`C|svnv#p%:>1HQxA`"UkKgGe0VpU^ "R$jZLncl"V DBL| V+bO@#pM a]]B5I u `u'")@4I$ " NH$BS5'TrG6eH}QTPW>be޽&;R!"Lַ~q??d$~-> .)좞J "J)N2U)"# ec.fe̵Zϣ6|pevCi&SG[z1qLͥr@&҈ HΠ[~} s ү0"~磔"iog;$"1K ua@b6?iG܋^V_Q0Ta HM@&Dz7d=Hׯ̜qTCdP-A >慗|t)K$@3g'oDQ<'}9oЧCPri>]dxRӤG #9=I$n PԤNcGj&RG,^Q u_|UD: Eb*<蹴 RdR(>PZ9$V%dGў?KQߦX5,=b$=3I #ΚCwӔ\rB= T;hbq>L&U#V[haIHݻ18Ga IĠtR`^} zPI[#F⢂HXRgȑ4x/{$]?CIԎ8$G^6J#/9;. ߳+0K."]ȁՋh`d@ 8;?MC$Zm?H8}=$tD%jEQQ pTqABdFk q\XsƮe>$1䭨z-禞z GLqvh )P26W)+djbhڵ;"j;.PN--Zh+j)Jg $OG/VMw #SUYr?:y 'ZW.=H0]`Wjу%5vvėHFlWHqW; S7pdžX2鏫xީ?LcM^rk꽓3gN||XE2X>. 1r+^_i.DʕGZƒbmPBI= {.%L6ϸzG=yŕJ$hcG\ &H&a"TbHLTwyi}S^4cGy9h\g6lg}Zc+i>@k|ԅRO5(E@{$qv6 ҋUdH4,yz*fYDCB(cмt9uwiTyw?]6zvP qίX[9k,_yhc]4߼y͚zE[Q! d+5%vVIНA6XUPTffn@x%sfqYj-f&OGY[w@A⼵\>DxRWixi(Q*T@_*Oo^ $}lY=.(GdYh)]g }yD#U==_#Rxc #ʻk1 wMIS6jlA'ztlU<.2KnȶXLQ8 U (ʈ}TXK~O=xЃ̴ڿJb½%7ix}H)]ҧ/r}}o."gj.ձ4m_N[R)`~=q4YH)~+7?xzps}e?Lj S^cܬFŢy0`3Ӓ 7RᓙA ŭN+3`Tf#&xѺG޾4dVGSOZqkck>P $9 !pwxD#M< ࣟ05.^}߃O=^h`11[Ǔ,qjk{fqZ<_)b1s[=!o;cRq(!N(`{);xRG;WB5~ĂJB G}2*HѪrsV3<$kMUPS3gWk cuKh%Sg/ i @{#^E^TESHp|@j?"| SnT^s~$ Ut)뭦pRײʞ{O(.se>wZ~͚59S+Dd,e(pO3y)?.4*\:J<#+)H\H060@O\PPs(ŃJIoAyW^yETs8E1mvq,tp5I1kUUA7e3nwRw6dgVTD6mj.Kor2[Y'#{Bj sD@>8-ET"s( Цtn1PHrw*0tFƑTT_xժ@Rב}J@:a^Zs\ެ? i!6dPǁ2X'@38]`ؠp @2:j?JfYH28.sIm?p45^k ^M;^]#C`g/ʞQ-w 鋥>~9 ՝u0(Gؐ>U9,:nwԀt$T$4LHR .sk'q@Ɂqu|-ǁHH;#AkHO]n9Orv=oW9a ;2O_H&=ex !8 64ꒊqJp\dS7A-N7˯6\{9_Ǻ}_=C:H"e˜.Ꮴ=ڴZI$x$:4 s.gs3ڨYIIX$N }AN+egIkB[cfW74>'EZ]9<`H+4qDeSRnQY~dUC8@J"1`2{DOmƌi(AMVaO tV"O_0%Lw+(hdht$T#Wt0EE$JկK1J"#>')~ Є(_rF% bdi;ќ0ޟH6BAC%GJ<+L]B+ɚ[k/T3G#%|<Fk|BKy#Y*'~7..` 8c}CN#FޮH[nMkRǮ\y7]+?WH#bb*UHHHaKHGF MPssnM=@:) ywhf *8R@o"A;')nZ'M HŨ?>&', Iac&`424Z"R3$Fawq&Cb1^Y>.7j^z'Gm0O3"H XKsCzRTtQY7D>,y ϟg7v0_#GH%Y4$] ,2juk洵G{$D/ w$,Hd'R.+ަytuOM+ؔ,=.(d"_t&G֔]"F2LӨ H<HNע#%iGQL.\q)` }XqY]\y씎#X:,vmئc@Hgi{{]=}*@^@k^+gqdu dSSX~tt{79x!JuAHA"sT;Ip#ݻ$D;q`W{et ḯ!ZAP[:㭎 8jy:O gh0E ³x9xon(.}C0G Z]euHo1إ Rԋ}x/L$K\JqO#R?…WwXwE[F?N!h]D1<_ݗWYaWkr\@R8oy4AI Q_<!vHl RG?X`IZWsD@Yw_*Hڊ`^ XAY[>gI0I, 8o5=VX Ӆ &/3Džk $!!!X+IIfE5}2@sDZ}&~ 軍vREmnTI_EQʄqkVMH+oOM '2H/Ч^HŢ_-[* Dtw, NxR!y"EN&#wLbi"_'IlJ#Y; / apԁ' f\.16|$OrvF  K9~J i q.tHUxβ=i ԴFq_pi_.F?9tJ;$4]QH# zeYa) ֦u ]8;q[sNPÅC_MhDi^tV|Q] ؈ThGᑼr miݽX% R!gs)YUm$D&y;aktZ~B5J)FwSw#^=6hh*SP`\]WCGw]6Pܰ\g2MxH6nCH.8tE9CRA!>8Ȥi_}HW_xo~%+j ݾ&[XJ0~e+ 6zґ< C`v m Zm);>X/q!"ԇ{@8ɀO0Hр 5<#r'&Sb1xT|FP+ oۭO2z|vO$058<h[NzfR3HTܳ{/ ? 2Cɇ+ 87hD\+quE䑼ź4H)E%AYs2PX%TܥIȞ@;ܺsqdV^I"o[Wj)H;DaD<>$$} WnbL{._NhTk;@_95JE;|@*we ':H"G:OϤ}:¾#wb I"!Ҥ3iTK8$Jإ2e"iJK#"EC RtF9tiN4:D4rP%g )gci@)+4p})HQ"]{?ѡmٚ66m^x/tORqI?Lv&\ ǭ>F DC+mG QZ}GPf|];Tw}Eg0R;if#W=zv1_}0/^ҋ\i 8: uZ8EvH/nvHQo:;u!@$9@z@>C:~]j)ONw^]Ҿ Q8f DJC2I;fnlO:^UAq~3oԏ:D@)diݤ͛KmL+F=V-J^B<IP%BZ>z >&qu@#iGe@bL>q} 2hnJ;_s%S #V"IG$)Ngp!)ER׮ruu-Zg#:~.Hrɣw ef|PI(l޳#rvPG4H}.Zu,ͣ}$Rڑ2kͼVVcHξAMv `VSEHG&eEZ{o H^ݥ"Z[ٽ%~̑QSXm&F*MA$ƅ{#*aHrҎi R '@#z*" A*"H/ERI $ˬ@.CJI;%ʮ@ұYTy':@l@w(!'^e]SaC:9HUc$d!ΰPjiUl.)ij{f.Hji7HC}AҮAaommIKCCRLE"3D;9o(oS$KGṂITThy^vGByhi78 &  (+:И[LEH85hI3vU:{&M iQ@o*N#q! e)h?=~~ cu@b}LJEjO]ZK <LLfQا$;pO 5]N H~qٟ&g$&[f>P5ZeSvO|I% B$"RR}VDbX5u4e /L=Ś'sq9?/ l8LuYRuz(mTJ9z"eEdptHZ2hX$H4R*ӈe7-M$*&&b{o#|XQSūP)+Rt$d'35 W~خ:i};I!I%"DR">='!=$^yG<% &a,fH9F(~1$#|]pH@SOOG *1 qqh$]I-)w܄D iq}t $M E?W ],N0E)oҦ $^@l'9;>sU&?bZ@JfʣX>:v%#2 QApxIOj@R"~0 _.#}yw9.9aI#4X !M<!ɑ 9A$cv֔["#=y4u 2zR/<'?w 39C8[zO)EFj"A~DZ`X$ȇHK'iWZdm ;L o:$*i}ilx x$t|֤ 1.*pt"ޫHf Ѡ$TvhH,rINHu $ AB4ˣKn{M <{Qo )v4k-҉˥4hR?x Nbܯ#iWF^|q*ufp(0Pũ Gez*nXZwK>|7%V^Օ& L2ll䔢ׯ^yv5#m2ի۾e  5i?b5|'8ԲBҊq\$HeNeH(%OI"T?nLƺ8^C[#‘ZZbMQ[ yPpJvᐞ eK B쑦ˮ")Vhf@R؈nl ȣ^QRv J٥e@r$҆t{V"Mba?nHc0FH BC#b;F[:! *\}3.:ġ]kEmMz$$HWA"']mt O=_*e CM,FpN$8pp?|@ήa |>9$7vaCjH!7pS6XK;ehHUV$[ҎTh$I;?K!k.ڨπƪ&9SvI}̚g<"߁iC#GuԻGXFn-?!{Qk\[< ;!P|I.ԚkzHp}Q!D1PQn*>5v}Hl AS `+,.Rer3W]< D!1 ``؁Pt8=o$=8Q3465F,#C8at"s$-OlYkˌpQXH!K)I#CH]4~gTkRvHH HD@q tٲ<1!|~G A69i  檥h "ј8[;e.Xļ#MH>HyAVO#ίv/Y\P$ $祔 yсANHlM (C RDBIwH0Hw#MHYYsv-iˣI]HT d4I(,t&RR^ rf*FܓS\)vK-l"XMEn"?9YI cHwZ?1$6;~^KAG8+ MwZbڅAHo H1kUxv([=bip3:h쯄1Q|l8rB+Z}KTN+eѵ38pF@b1z%H@%gNh$`T&=5Eb1*p50hffD9SHxa'HЇQa[-CoyfrX)#uPp Hw.AR]VfCߝ444 4diqn^f=5Ǔ߇*),?ݯ^xfbsWG $H@6؀t>6_ȭr lYl?20= :^]]R=)Ea J;vmEH;MQ $] 1tgF;;1&<(Tq TqV#c'U@ nf%v!yEa )<*2b\\0a>qΚr32qЅ+qJ qIkt4b )c ]oc *l`"%GI\Zz!t@W);1*xdiFv l鰏ǐsPF1CZn*fnڈ}sXyfHJgZU_ "Q;u^Z;&׾$0_;uI54E q >sbQΎpT&I E["IgyPg I;ƑQoök8nJz>"@_܍QUIJ|0H\$C/=䬲a$"31OdXX2d)p72v cˑ3܋QہԸ)-@r.?MU/Áv#jQ%/,w+8ݡSGM֤MNTxBZ Rc[ʁ:fE6qamV>qΚrkj H#A858AA$nHX]Q$H#,0eؤ$Ry3\jZ}::} xVh:xJ ZhZ{>R,<"Ok\ťTe";)}sb/<$iJ{)7 :ĩqAR#MH,A qzT~w2GݥԦNݗJ)K"$˾^7C6I i[ʟd$(6 m% " H^ܽ zRN!.3  %oYV\QDnaHNR;;hw\@yԵ$v@ߊ6 ı7XD !kW- RCc(q)Q)@rsw:w\]HМ82>04>vޤySqղnC {#d N|%i 7qCׁ=.Z TH~q6 $xF55480aK$(EݢE+)HIc=0GSjsuH@zHl@j @5" 1,Yh7+a(JxJBW'l䐰+%ԎP4sը#ԀYH\bG"]?I;M$1 $}yHL 4OD${]0G8i^#.jpdwMq;LǨ1&: cu=fɲ2zMYvBRJW=UФhk<MڥDDH<w~qwbvvwfίwo1v<YAŇվMb4\&ji|O%s H zH2Ggi<$x=L >J$ ߭! =LaAV Ab (0o+t`z)w~nIڴvZ&16 }_pa!7=ЃMKv]j̈ TcX$ޓ!nt ! $ 1i.*z a?7]߮b#[@g}SHHHMbk8pkvf;Μ# ϏʼnQ$( Q}!ƠCRdk#ԖϥIpO?'^*&sm@:eG`fL2H٘ HoX͈t\Mh5HۗD[У\^0XdxWW;[ךcv=֖z6Dnֲ 7f,#cN98EnG:$V_JT; lTİH#7i}Ìo\.FŘX1HȘ' cI$t4B2sˏ0H48=ZmL8!ptajHYڝ DȓB ]3Ho͉Q;|5ql" 4}^:,@v8dŶ6 ht-[DEAg&+g ,`)vr bV I)r"#ZDHJ H/\rHD$!cvbP{{wjТV ́Ѫ~qhYr/Hϖ&qbuU#Q=@j=0?SỳXrw*O%)uS\2n-x<;Od^bouaaԁ^ќCخ[3SAtPa f}#V5 ziG)114{axW v 3;446UuK;=3!n cڢo?q+@R"'1Տi6l|o(eWG @&=q"Բ};Hv H>𑞵Gx!@nkDB$X;A< :H\*,"dK]X9N|QtH X}PUD?H%Ƞ \qㅇl-vc߉Ϟ&qVl-L!҃hP.oXnXᅁuE;Zΰ8&FIFqg3Iui@b<:j5 UNR6`i4`0zmo tvc8*A/:$r ^\uCtl85_LTfx7j"f'II 8i#v}ZE>ټcDsO vv(ۡytmc@" cAPl.pӄ5$1vrF7c_-0E~@z'&R 1ſI \6I(kH !F|>n[V aiLc!@RxtzQy4hjHk}sf-E- ~d}0-ٌg)/[sM G$+AC}j Պ_3PjmI˫%s4wCb4bK_|4C*ha s܎v)>ʒkХ%VuW療PZD!д+Hc@zy[.2"#L4K; γc-B`@b RCajʕ#Z5 n@BM= O]^@т Pa׷pvlq| ʔor:%P?23UPCJQCƣ(fw๥Nbv/\IEU>$;Nk:wX ,@zW=@jqFxs-ޛl2)R,RCq6 uA] X:h u%A۠@OA"v?'fَDq;ˏan(W,f\<̬\l<1g}jHi c *9&9_a=4p̰X5yI\c16QrXRk' r`2MP`@JsJp-ImmB:Rƴ< VQğ+R枍y>^dwkI Gt W3AwB^{1k[XZydkB4[3-8+QU\h30  öm#臊aPc@Zz#Qܮ*5@nR M%`0qa'#@}uiGB㚓3ɤ?95#xGA9;N gd!a8]:$R}tH0w@!Rھ]e{9ACr_30`jooV~4)i7(b\J!GEoo"F~g  l(d;YGs:eg=X7t[Z;Ur{SJ0T_;SJM^ _K]Ӂx*.o.5?<꣣]U \aKr`mG)ohTʖ+VT'tu)29ݵڐlI؏(%An_nf,Qg~?g%SlH(M.8j2jv5:|<ȈdD[DǸyUΣeD DqӏJE 9ƺoI7$H:GnԤT$o!;RޥX*2YvM'q:/>NK|RɸG=&R+bsҀmV)TJGAC ښ ZN;Q#!nlAV˻fT9Kvtdl9+>󸃞`|UgzWMb'|2zMDefmxNRKtH 1RGKhɤTNP¸uމ2wz%5²%D$RGy{o&EpIOlpZW~~yǜx㍁4O`QOtHQtFH42^H@BVpxupser(`rE(:8o_#Vh*۪zyw츝*g܎~?gv=~nʪl[دҏ 15 njGX#ypc5:rlmX^ʣYg"HCaS/fb3׾7O !t3NaMŐtVS'*bu8s'Bг {p=ȔM}7{ȫNӞ@z"2K=>Iiwሐd>ɐ\磛ʣ )Blu1'BgRe͍SM[ni3Pru/N>8MGܽC)r %G DʫF`$k1@kg)D?3i.8ĭ Jĥg:4z1y̅R5@^8UlXz{{@"$Y'I1kO[`D+IOWz#HHz6<$Ff9K[\r}tu其G2"Q/uV)X%Pr;1܆Ej{Kkki$ ),b'y90$Rs-cEH!Rв+04 6$@))Qu`6p:kA=0ƣ=IQIdz#xyx4<G$ER0@B#gĤ&H#w"54p˟X?mK۷o_ҊuK.uxs[{~M&6w`.Kڥzv(XJEW,q 3*@"Z[Cu}LH*d3xDw/Մ&kZ# I4 $&H P)0)l,XVYPERyK$NK+J i@R$NS*CDB=H*"1Yή#NI^)s@Rh[(@c-ܘHZq,I_K֥V]'%zG+ $Q;ljy04j;y΋G|::;melKQ- A$uAKiG÷4{p]ޫW":&Oݱ6*'oP4`A _`"m# B,IӅx"Ĥ˖,3z^zCOFRHD$x2Jx CQ)NM Y&@*hi $l+[[$$Ȉj i%8n x0O?3 .9z";&K  KΆ>$1nI0̩PѪ'?FnS_Clj?Kaa0H@xO}fy#HnjOu Dp<R8M d^5-Rtx@*ǂ:3쎑@RBnI#dkr7fH؁469]%t;h@bHc}@ ziz.#씰"-Lkar5')y3ZdˣCy#a|?Rf'lqy*ԓMȩ||#Y@):?Y1MXf:3-" cE%IZ å$LbԎj2 HIykt!K۹Cv an AKôk 1P: #M "k&TGŇI:h"E^ 9Gnor+oB3 CB.F *(l׮QQl\^o$^R3%GEP鐈H{M<1Q*ng F>j(;ԗ`cvsH@b"I` Ql8y% aqrB JE!;6HI9bv;ڋn=N 6)_, ƼFbl㍖Ip|Z|"q~~  ܇DD O..=O..}U.Oιm]Rt44уtE`2$^$'OeFF^E_!e3KaGNzb4?Jv):ϐ"Y&r"e:"ֱ $d HjQK:ũVqc 1hy:`h^$eEP'X"4EDJ+ :42G"H% HkY+NN"dBc 'Bh}]/b\SD8s%B9#^2)GVhkw̘DZ6sIP D>$LkUo\+÷C -4~)SP :g )0H-ҋK1;l/ayDZefEViHY ;Ue6viwk$Sstp=_\ =H<-,Wr9є:ħR."@w?q4%9l i|aMDUlH:[$0#ғ##'VuR=b!'"1 unOG@"H 6J8gD8l]܃ہjt>.⪅7nهOЌ;۱ :Ivu)Azq+!hDYDZ޷xoAK`EBwcKS4VC^1b!tҲgzᮀzW&T4bِRRX7- I!A F?a0tJ׌!8Y>@5݇Y )r2vx;8>Cz.탁tuB!3f.ݮ ՗AHV䪞O^^RR[i:`_1!1H{؀4~Yx1bqyH{+bK>[8Z #i|!" G?%⑯G;5/.4vHZlqQ˹̊xPvH2Ǧl%Hu}~`ف<'8b$AI(O?o5J4h("EHa" 4_iDD E9!"-xo?F0fNcw۱XtŖpTQAT5묁7/GCpHl~@Ja҇(OQFdb QSǦhz QQ$$Ts;"T(+.Q]ZRpDb%Fn$#zdBJ`R}#si4j+fH"mHl?IėoWܷ1jLG.CbxXVpuH9HR'y)J<w3 )@kX%3RҁY]@u (^Ҋ6 uM Z{H$58xD ?!@;D\qݿ!vRHpG)=l\@*FHZ)oPFNT#i/(DBw QSz]Um!;?9&8l~Hiz0# ?ӟ԰)DR79#Cf1 Mb HOہ~ǀR6 A$x`9iwSaK#L~V+a.)vkTѮ 9㈝]i$IgC*O"y$y1'#H3fU"$$ "EFaR(V<6mXˮh{*H-ґ,Տ  3G!ƷهSUp4JDaE!>Aѡw _цIy?!.W2 估9!E4#TsHH! WI1 H)8Qi{:,I *•  |ȊҗlK8f׏#-T-(*:N}A)i;>z$"#7!od^gbt/S]ƪl[δoH B2I qs7q"tnCuH܎PHA8|?nGzq"A}HHo/! A2XHoo "I$N HYHa$ I`#eV(*I"tKB#j/ɰi#vy)~} A"{ش`2V'_81S^Ih75Cb Ha(Hdw챯v!<:eHHybIpLHűK#dWՊR!Ed7^D:Zd7`>>ޫKÖ4yHi#}h>K-)h`Rp-R@8NىHwe~H[!dܤYo{ss{'/sYJ~qAt G$ލkH$H,[$1YH,gZL^xkDVfp˙n{.dlQΟ#v={,ti0m!RdQ!.yRQG0'SJP7ԉu:W9?`uj&-}BH#Y#u3R,uow<ϋb;aK-@".Ụl$'$#c'ܽy೉4,VfɗrO( ⮩f7:4 h=!_p^͑E_'آ>n<3[m>:HmxKq QfJr*-"nwnc}NsS` R')\5[뛏9ߪg )3d=]uӗɰwQ,Ra)̫), Ty ;L$Q>Uߊ7rl+el]f#_KܓOgEߩG$ޓ.ЈsZMD#"~zd$4"Fb]N,,|uJHءK.ܐ6җ綿{@O|/]A.I҅8T@ {XLQvhCF::1N҄)-T$*ҭe3!2.V&Ұ}䢪Z6ԇ`@?u0?X ,Ϟ5e!q rש\\%"\U0ֶ$ӭ1JD!`[E"Tb99[NyC^IJ!5 *pDE3K; $T9پ0RF5$m%YLa8:(#0J>8H_> {(ΎS*Rn=RX;jDW 0F߅І6H3 X|v=U-}e mͷZޞ&i`+u/6}yk9B }{"f!i20iԱ7 "颠esH(s @"}H[[жR0~YTW|k k! Kg@0ߔZrJt f ZRBq|)ie $+3cC*/SNQ]S-ˆ$$ ǥcܢu iq]giEҐ;]O.9];|u"v0i\'y$$ٰg = 08Ӕǎ穀Hu`w陬Cc%0n"f"EFҒoDn%(T- ,*xju@Q5(GMss@'^IY[GuipT~d vnF1 ;fH0)Rʩi"AZ,2ek6Hd aØ_ݔ@A͜C&Hd 1M@j' qfib ;\6 }_7v5,a4FfS2t@S+߽߳E~Ťyu"}|ŸDEL&,\xz+§1luڪ:vT:\FE'Qb>D}TpG]k2N5t - .N_S+(EQvlJնRPhgfF;ݱOV$摅H쯳{R:4[B?5 ESH<H9z9,4 D_!н=PѤ#e&95AD 134$ĵRkS,Y&jiU&U"L@mJiα/"Z\X].D# ΨNH8ZHP@brf]9əgd1~UifR^~y $$(<H 5zzdDH_R] D! * E!fiEQoM}IJe$ˎLꛇ p rLQ& T-o[N:饫mա G@b~y@"*(e}m1(j#,:Q$&I[b/s+N$ 6F xMԮ_)B&6(TNQ'{T,G؉1EH˻Ʒ`7ʏN$ջySGm#xd{\F$ҕ 0(Oq2! $/CD`1 1L0Lrf v ᵸ>ER-;"</!տ+l{B"]i\Gŏ*KIY㭁؀cq/E ח3٥n ADpI;bi3H'<(GlHmk,I+ZHL$#IJTj qos#pL_`ҡgsq^fezͅ|3ߚ#;3eo&~)>%U-Aضҡ2jӡ%b4BGXx;G6Ʈ)?Ueь/ATDA NAdkOojhE3?su/*n@GuHϸNrs"*jnͳJ1C(Gd9@bҠC8q4 ++HbPfo \(xnE')7] ߜq#Nn7޳АoH#4I$P˴lqٹ@76$=:6JMNMboŭ2RUt >RyInnW@n7aÎ<$hH^-|5j@bY|Skw< * 5|c-^RdHSY Թ؆E9Kg8Ŀj\rHt2S 6)DX*Q;#uN02]J11Azc:8@#>iG;ܞBPi5P׮ƀ4 "qƝ0y㹔CHX%6(BQ?P]Ft@{ 6 -th:`PڞЗS:^?A:73Yz A{Ea-#Eˎ1yL@@c-> R\՗ydH;oܡ!~:yH]r.;W=SQbQ.9p*mWG}|GT:pǶ. Soy!uAQ@w7Qbw#xM{9q*kCۥis6Koȱ؄hI PuZɩ ɤs\FbIw_瑍Ո;O4[np2{!n>:}Ile!RXDT£暡Ly3ř@7?CIZ$o 5xxPtkaՋ3cn Bv[zg OW M4Wn0 {'N;-t;{%Z5$a?%{4qLL"1[37!X>)G86f) $_IFaVJ +O&Ǚ} r0 >u HH8Oϡ_̨3cgupMS-ْg4Xb[ qǯ>͉'~ԫsPz.ʼJ]D8QId:9l=8y } )j/҉δ(PKK?]\w^XwFBBo ckE=ojO>d4h?2{N ms@da/Z5Y 37 9;呸6NjST" "Hl* =]vUOͼY̫0k9R)! q!:aS+8в9 "oQ`!fy pz_wIx7pd!I  D͐1}/>,m>}J;VsvHmTy" xie/_!tV=[E5TNce R"gGuv2eGNfm W @2gh& FW:x. }y?{ujg:5(FKs,yih$E* "1>3}Q-́zbA@ɓ;i :'p8 4CY$USU*$9&__+R>{]?{3Xk UHocBj$F̼HGt Z[ [JEbu8u.eJws5dF3H^k/{jV?͆9Pg*.H` j ņ.QcX1K>)E>$=#e.Jzx.eX˸ ɜE:CBh4~t%+3bիbkDnk w͓W/;(1T_n;V^6A,v!u꟝sSv5a]@@nqJ h%cѸt?ͧ 5 H{"X$z2إLw(婦ore\1ٓh!k شUZމ 0Hķ6@:ßH pޚŽڳr΂u:Ucs\| FU[ eƐ@w7K wȩN05e]wR[ * g4:ӆ"u?H| ϠL?<.?$+OuDS&4:Hb͚&rJN0վ 7~qRšFcqX 1=1[/Nz_T*}dYw;Kn8g):نwxEIGr^=>GLӳ$V><'_+mF#=فHF$~ ظA8Ƀ?a=gwg{"E A^ vB*(/Wʥ%ޞ%ȹnߌ@6D9pI|= sj(9£svt5l"#\1 qwD0GnC15^%~`x)Ias@b 9u[eVKNձ k%P >!oQ\+n44Wm&ɔ݋@z"9GKA6Wp6W4WDiޅGj@ScDɉ8ym,wre8/@6HuƑz#`ѣ"MW@S[hG@LncG"`.bBmU1 5evlX`U5JQvHٽÚE"$Fņp_ vf $lA nV%~Z]ݺuH'3n:(gr$}Ia}8_t~SΠ2xY t)eU:5=>VJ9x,_HbG|ł7$H2ge.bݷzk䞰!`RGAM׵zqO,S\/Z#E@#(p$SvZ2|^~صd'# ݿE'5\ )'U6CB.k]o;]Ғ~}]HS X1P"9dK#2eǃ2Hp.%'"+% a Y@ʇ@RQ J$  ̂F :}C@);3t`av ";kEҗ_V9'J( ơH:W-L CNJz"KȮ]wc]}\n9ZlZ_0?Sh${6nyb{bC|]躡v>.ٔ?p?mK׺ ;HE1GT6u |\A<CY^i׮wUы דǿ|耄 [hȻHBgtdox#N@'l} 0~_s7~_.@;$9/!rq0aDCff$k=_XS"UVRW 57v4`f|<tHI"ŶH\s$VN![!Ҙne,7+>lvSjj[+U3@XJr NYsw` Ozx@WLN(uR1lJk~V,N*.ʥ0w/[g?f`=f&qoR$qtK/Zq8p-.!^X5xlFƾ5HϯI}_}{_}-|_Tb8)?8Ǻ6ӎƣi;^eWHv N- >s$'gJ<-G$_Ž-C1T6ZD6 9ylVN,<{Rq&u}`Rk6*4|Rv=ǘ:HMSxyWLTAEȶ$Uف<{7e@+!8$B BYl !ug^Ru`Q CQ8*b~d!ჴc:/TRv$^ 2v:v\k7zcC"uH<`?gD҄!p檱H2oJ2esK@ /ǗII[zE!|?U!D7B.irKFv$j|g*idS=buo MGD#v m7CG)H⑗r ~SͷjdGl`au^{xڡNՖ;Ig ~$tmC=d%]1AtHLG!kq7fwULBM P2>Rh$EҊ9Z8QҾd_&J!+<$)Ăr,ΞnLa9#JK<O}DvI('4[  w@ E1F3.0@Kn~Q+ˀĄn[xMI vF󬳌fJEJAw+J@t`7D0ډF+[Pm69/){! *5uX!s!wg&߷ԍ&pSBYFA@ڬ40N TvDOԣH]L#y,!t%`% Y&}om¦m}> w>xdԷ/Aێ<_f y69]AK6v3hs{Dѥ$Ȑ-f?ڥb "vɷd ;G,d f&vr*2lNU%GR6!ـ1C@5ib֠?[Rn(m&Ƣ&ZDC5 6`6Wm֐{1jd Iep~mI!c$"qb 6&42#1윱O_4)y(UN%fg>hү^!7"UKLGJ ]CHrD,^܆lvZ:H/LF!Y|#z U>u{ F I(壳Rn'08څWWWWJVl[|qARA6ur2Ep*f_eн3@i=Ƹ@[a "aOSG3/5>HwGԔ FI 4Q';%Tm@$%웶HA_$A+ |ixp1"f6w%$Jd1T"_\Qܲv9ɣwwionģ}l|R(slhqnˮD# v%$n#0ṚFl0#‰?%|n[H^xץJ#, <6g d Di9.|,xfHc 6de,SIY˿{2@O[n@jqTFPH89H֞^ypWNV)9~k]jE:KaUAfgHv"i.ҧv"99K)}} >R8z`xC/y&KzRS(P^4? uOw:g ژ+v 18dstA,;H:eS8`DіY؍ %ؑD%?srNHzm M% mbz]({a77[/}cq8 R&tđ5 !]Ѩbe@c;y *\>.88]qM3>H)GWSNɟh,&R@:PF‘5d㐝|u( O慳4=ǷݹgۀT<cP#$uX"fI& eunbDAcnyA YH8eۺ5LRl)lZxl,\慍Fa#iiBM쳧4HԵȸC&RFջe~&m@Ab AJ;H HCbA}~_bvT2\a.𛵱OOf23@2Dg$,cOKxT LY8{+_({gNr{,90肞wOi%uayO-X}@$-%}kVyо\Ot(~O& hMhRNdɞI~,$CI {PGoj8AUeFp|Q !u|Uo۷V]JE/;9B:2WnRV"4T[6gn+$E)1U EBjD6ԧfPOJzay,?KHuW4\7ap$"R]xDs[Dn:WH[J*)'Re $Ihv\E½.3v'v²t-$uiY_wb.K*h(o-lǟ$IH@Jʊx'~C{Sl˻-@τ ?#_o }3g$N. i rNhc),*{@!N){Ut# hMvGbwrڝw.>0P AxjEfBל@nx 1HL$I`H@"A=?UOSӹSi?8RT%Rw@r̴6gw+}ۉAyWJ3v>d]#*l ϧa/S;%^dE3/ *sؿlug5ARKj6n-ԭ)GjP蹁UnG}O3̛R: ۦD!Ym~e砝mEK I#+!և,p;Q/O;߿&lYd,fՖx伏ӈdٱx#a1Ff}Ut* d3e 5,Z[:s*:j *7ky7ٕHV9A"]AԿ]>V&7mrُ1om eF.qHde]Bܷ+[ή0lBi G"2W3H ɁH~sl@C ֩Ї~c}Vz*457h6)o'%sX6^GjQw1cvm 65o%0w ~Fފu3los 5q8ZI/i||75"7tbi*~swnTQ!$FMZJZj,QiU+D'>i ITj^rF ZтPox+B_A^3Ys3I&{nxbN3_3p27K]'t:T%缋i?lKK.f2ѦHZ%,2MU <'n;:Y0vz@XoQܟ 4_T qt ^I|)hzl'p|T+4Ȋ֙uh9HLGUb]ڹ.5#iG?C'"Su{"t>*|y#AI[&{%0s@ Sbߘ4xv~N @йA¹|/z2--*u,^1~zlc1UK@*|VG¿H}WulHNLU,B1"eG54ZQ"+ހ~2#RI;]:<͛ !f ЫUCǝvS}t]{׼*&Ua f|R4۝+ۍ}[O0(ں۵=koWH2A@Zyq_QIkx+]R }Tr_a@*aR,D襤tM!@h쏥%0ʰ 4` B 6T厈HlJח ],mÐLE9:d'HC賿HZRЧ˽CWEd"RѩHaG KdyCq9O*.H{SƁ4]=P7tJv]/K[zc{ӍAL N(D~{tS B$4k~ԏo5/p0lHM5:f:fP a!AVZ(sn 4HꄩF#<]2T`(UatU?P⟿੃)pXBnڍrM>'!DҲr94mBR }~С3BѠ~Yg 3 iqqe@R΄xB5$N(5:Wӥ)q,Hy}tH`N-j(J( 5QI^W=n -Pa/h$4ZuBe7<|Cm !"&RWuzP]c}Ejҁ)8d 行?O`KZYgBvH(PH/; EWmovC/4 W_zu'@Zߺ^k[\ovH#jW+@ RooҐHi  KL#j*> ֕\c;<@rHQu6PMrJ"?~]j*]jjj#Hǫy۝d76SK!H)h8Zi4)h8XىCҰPm8d qY-j)9 SOCZq|'oŮnҧHxE @b ŠHqH9$ړ;v[同@IȐPR)벃GxThk\NsO>&mlQ-j ZI#@)~ZQ5XE& Ǭ珎z{(#v$<ZNjAnzwnzP\H8lDcsVފ4)2^H_>"t uVe "I 97 8e!Q?Ul!zo&֖@ˈHD#}Rug{{ggŃBoǻ@::⠝"z',}{Vț@:(ttut.8(F)$ضY"ª;I!iy{z&5+Xu\(}l675(ueyg)'6󇁔i+5^xkSW:c'Qz-:z| 5UťkJ>rHiY @[=吠 4cP\tD":.¶4A(6/mn@H+!R;no7= t9Cb5Ox襮;|W A:aJ27/>"5 $2HEtsM_\G );בBB? !it2b M!N}ǵp=r`Ѱ l^CZʺA[[|$r N/ :1Jkm )gjK^ A:hscRT5')mcGz<, EsHpJ0GdR #TŧXc Jgc!}y吮p8$%A$ђes>'(9^ $qD8 tHf'&$c/@2j;H# FΏ&o|_8"l^8tƗ_ڧ3YKZ4܀aeI$"i 3HY6C1ںUdy"b]Rv<&@$,VBD 6(e@m햫 C8%6I>ٌ4H;ڈH4@򓲨YNCTEI.dUd:)޼1J.&(bEbŁ89|t6+RlľJ[!<4?ᐐE AG m̥a-S*GtTR %S R157S.JZ@22DmT9$(!H۬vHoZPrHR>8VpJ5JH=RE bO"k0N4D.BM#v@ҴG ;pC_\Իv<ځىZ7~|O#~yViutʱ V# :a q]p]3Xh1s"m$D5(RHRAzRH܏Hvs VN"nK!uALh9G"C8Mnf5o<%Cm rZ\bESϼ~o=^FR:7H H{!E2Ch5b@*Ҕ3R m>5$Q,f~A#-(BvEYȨx>P*fIya,1qq2:SFsrlxK| $DȴI%{<_U٭l.uH\da,ΩSe(58CPq FE L$#*pp5@f.(w>Ҳ@Ba@;2S7R|y-bsHCrkCE}ZغWzE AsG\0D-tAX@F}z"'WK䩧.9 6%3y]#@q ޼VESNWdչ&W̮6,VĻq#qkεeD"di~!p I<zbr9 ͛D%(`d$ s(eo/x$@84oQH-L!r5@r]0Q$U* ^ 1* <(2H]/}K6VJN+ji;XEi-. C:Ѱcq@{)j.Hũ6O6]2Ȣll jw+P(TQOtH vTN9 Xm*&9NV ^ u!-R!utԀD*Yt}a9$^|SѸEg{M }GqD^PƢs Ҋ#F10k吨b4hW AfoWWw@O~mEAZR54K@:w561st ZVT[kQUĨu~P@ѪKt'A;*8k]2U$.hDL-b bKb#}s.9336'v}ޫ*UI> "ہOkRn@%d[!ypa:a8p@"kP9#)Zɝ}ȪIQÈ 7D*)T97(6I@Z Q"GQf@ )*b<@8N YQK$ÉHKڃoD#vqh )DH;W!yH8Y$-*CY*l`^54qḤ'_@lTnFicsHT@TJ:_iS GCM[Cs""Xe d{R]x |IRM\ 9$?! 4Ih2񈈴G"ٙέ[@zCDUN!5: (DxD=HL<}: yDSH, Qp^iS.(B8"۞z!@Cj{jA"HS\ _6 3!sf^ )3#]Z*0 H8[?jRaeŰ4͉Zy ٩vXM3@ 6[]2FtPS HEJ A0)8]2q1\H>|H*_H[#oPԨ+\/$'>r{A*R% *j L='o|x?|XGCB uL -bD}w/{yѭw^ΎR%**iEv5ewUz H},ҟ!@Z;֭KDLWHUtࣿFI$n16s_kz -B}<2"tK#ܧwHC6xy`4 ]|#Ӗ7}!YD: 0Js6mgBZ0dK EJ>!)/\H`M5f`tL9$ҨivЕR^}+XR7Npޚ-G"fFNgNM=kZ-tn)&724Z2" qHlM# A%@Z, $,j~WyRk4." z;թ.lh pH+XCZHb pH%q'CD#>VH30vyl8=q9R*2q[8$eKkE rH PFi4a$}Sٷ:z<Ji um$Hʋ&\z @j\}[y’웫mg(rH6ȝ"7%H!uv$hK B۷>< {)< ; A?mn". -Wυ.(d rUa ғ%"}3=| Z+swΕm#1.!D" V7dCg{M $R0N:(ZcT8 LV:-V+ɡ):O↴&N!fqn3"գ%G^g]+WuZ:)Zd6._x[jeNjՁ;dr{zD^.tH 6j5 댾#Pt7t %I;@;OsHWVB:!`F@"")xoOK }YGc+]Io$Vk``D <c@H,Hӌ#*"(V*'oV4^ W RCZ䶩`"}z٪F$][CZ;_@Zqo_*d^hCvE}fAHr&V ))Ny\\ $^pc 2"}8$"R6Z@mHH* d2t_Y8MI,bt:ZzO:Ucǭɔo;MiӦ}+wH)m f4wj` 5vع^ nB^b?|I,OZzЮ]>e׌OH]QH'^T .}Bi%nN_6I)uk':y (b N ] 5%ᑜ՜A#wsy_~'`^(P!Tf#K[= gC'lLv`U^(ŪdZ-RZG=@Elu!6-@+!;nPz$: !^ Ri{q:DPߩCq[BRT|g,7|F )F8$7'uwtt#hqsՔ$@zFǃ0с.}CGaU6J1E#'O Iخ^W5zsrWó韐H" QNA#va ˻E';RHȴVolLϷvz;e!9E={yv7U[5=\%М16q7oJ 9H.A-{RHG~.L'@<IԞ t$=dф}A@(GE *G_8th,zK@B ЀkbXՕypH<7)Dn a@CJk2@ɴ!Iᘥ 1%mr٧2@@7ߒ2W9+Dvq!gNe[C”ѝu;?ƅ.UEήcչD|c{)N^RJ3A_>.~H]!-s򄁤EÑp[Y XI}}B`[IZn}gnY$Rݕ\D! %M;y@i94 y]H]y ^v#!/  K!A5& *9yD@A*> La~s>JG~۶ |}۞H{qPt M5᭽Yg'vza=ݡ~7v<11Oa2H(VB$t׬itGʈK^DĿ-?8-^;5>!o琘IlBA'>)J O>'}=ID(Orۻgֲ+}?/f,dEbE0d€TfUH+||oX72B ;$ _Hdj+9*\A$Qa ˕wAllT` C*9TC :D[gh<"Fjx\!}6u PHSJ9&DrA  j)=XhtH@bqU޹aDuv969$EucvJ/UegJ 8$w:$g:ly wUv2;ɲ@:fq)"diüy.iڇʦHH.Zdxf>X&i֜ڥA>rRq9x63;`uM|* "e)%W:8RPhWĮjņF]5l i+Xkl y*@2 V)iE 5GAZcTa!qi)%5CD ()FG`It@R쐰(A+&I4lG(qHQ)04I іmOX! #sHncozlŚP IE"A}sE$@$hf s)p!B T\e5|_m4Gٷj/c[v6dŽd&ͥ<;@i;$JSTC QZdFX[.$`\'HP+LQ6H: ņ3fDhp(H_qQWY!h}c e %Ѝ;y3 x9sHImr'[{!ޗX`٣20YÈylB饱7%^o2H@] ;$q̘s H4"VK4AbiXȩ]ejilBhL@H\v4P5!NJhj@zUhK60[hHqHb>Ue aˮ}}TYҍBrp<Z>/Gmuz@\?4QqRid6/`z3]qNE8 <HL#]mxm.ۼ[/hH#}7xd U[$@?Tp 9(%ҶAbDvzN3d3TMɑFJCj/(($4 I#`Ԉ4=Z 吠8K6.WK"е=A΅QF@k䣶LA P8z`BE=1Ǵ,o,1(U$-P!;ї#vH=F0282j|\Bտ]S(2|yRrދ Bf!Ohfq4~DK$䏪 珘4v}K\uZ"6 E )K)Vtݬ>8pNP 7*T> &>q xnNbuQ+lmY~=$#؍;I#؍K.r!SQewכW:* )"}\pvW|4.U_3QAPH]v($ .$"d9 );CM}#H|hG2 en5;kwH&xΞ(AbW=v2PH\` tÕ=_t:+KQ4NFnZ 5JpYKd)EGʞݔeŌh 9dW T֪냬d>C&I؁MQ>8E8Ttq3QFt+C@G%ޭ27]Dz+{fG|Uq S! V׾[@ @!8+B~QFB`GYo+F8,WH[9[; ׋jR'Z!+OUH.BȅBbC%a׏IHMCJf)չڜ@̩iI҆pd()Qk1CleugdeFfVJ/_.Iqtӓ]Bi: >l {{ N 9C#iE{:1^7O|HHA@AI VǕD\Z\y@4FCJ - R*X)J+A0y0տGc5g >#}x"˞egd'L 9v% v[&5&:ݒ^cG(i)(;A>YvhR㯢r>p\y"Nv RC  CݔkިH#?rXKMQ'`PⅢW S2T8LٰJA8F!HA$%:J%ȕ@G&ox*>Dh$>2 B d8EQ&e0*"?/=I@Ʈlv3߫{>@oTʬ)|S>%+-R$G(%wH7=m>.<_Ǎ?? M8WKv8QUGƥU fiR*:%H4Fek3;#)G! =?OwBV`_;'n Z8}%q w&z.5qc'X^牱ߏYn+DMHI6Xn!q꛱1;Q?K;o 훧j똏$ϫT柖% ]? . 33a(ܓ Rz 6 };P<1YqǼ.5qc?$3@ףuqdI`hJrؼ1z_T]Tx.e$=7m),0:1(c)ģ#z61_lP+К5Y R|6 LëkZz=(z5] F)wݦ_ 8/Z[ )$CFG qCx](HW?_OO?_!X鬝j5û<+b(J}uW$ZDeP$'-in!q|.Hijg Enݙufd 1hϞ=S}o M*>C ؇AVU+:Ȋxxl >=ּ*T C%Tr~?( 75RGڅx~*8!{m0>0nB7k˟G^t]7 a tǴ:4Me^+'ŝDi(W?g"GHp}T.H W}.C{wH1散; mq^iEI揈'.p փv|fEC/踇*1[ǝ竦絸Wţ~v;`J%"ч.71IMSEt Д eoMСdža4,+ћg2[+S# 6P1x'0g@5jGs2ABG^.CwK+.tDh7?S3ZB˯LkGkLUv0I=0=o"q 2ޟ,:Kn-9HBT IpMY.M7=v'N-u>iȉۊ!HE e:ė7 dt;$H* p+bq5ѷ- @rMv=cZj,Thd/f CŨ@OfSf9_0W htE ??L'sI7V2} B584@f?V*/P^ހˏ,H se +Ixns1OJ_nJoP|05!Ң&^DFFع|Nm o}Eh1"/2Q(W.?\xc{9_=, M4[=]Rz(A)USArR_2Yۏqk5$^v3XI @kCq"7hQd u7.q"HƖAAve H$HeTZpڬ9/wfF0nQJRFvGiy/uol}}>k"!˶ %RE`+ʯ4'fK}9ItFa:x]d|qbDd4|cfFv|"uڵf\Һ|%zf1=ékjZ׻ l as/f4 K9 J*]ƫ=[{R@AMO *G*$M4!tjsVԢ>)rh")4u)+ƩQ h*֔_A߯J|M8{As>.H~qmԝ9+n$Зf$@uuѢȎEB90\Xt i!A b3m\*w-4":&oD|?G5*((~bCu LHLuDAcXEco.82DAAOIwzv'39֭[繺p+35*^7,.}^~ђ?ky&Le-xв@yOزȓE:QxKC^"!n!ۊw!7S;%M4#cMv,?YL*1bQhx_ˑtB-u'=<7tZouAĹH>=&[/LubAa#= ,:Duוm/|Q{Y җ&VńX#ʣt^Q p[h(H^HһPxZ[QG% dj ٸ\<; =q5\0WWP^3ԮˣgtpB q ˑy|i{-K@rچ5>h޴*5]}<g/"ڮ@94eJ``ƺqt0֑c+wUy/Nc/nG ȣ+BlQ_wϦl@2im< ~כYf+Z<>B&0%K+ MaėSCHmt*apMPM墂^n>1ME ]vM2{7|ti?E֠J7 17 ̨zكuUZbFXL>4Վj͓i&vK?* ୥;ܱ'}']َܳCXv44T5#e ZH<F.;yp]+K<4o=vZO6|1xy^d`cSHӕ  ǵ]?GOϞ={Ks{%m"HGO9<(-: H&(HJX4l 8=FG"9&c Sr X `!17 $Otg!aLĦb w=}*Bbyч£00"<~CCKFh:AСEKvv=?W_¥Yod)GPHӞ~ Ͷyg6|\_܂ yv;Ml'^H@"]zyʏaH0o)oIWf_/wU:^@l|Л@^r^ho_ X]<1l{[LVɣXy$vlV!=>@44B~f^`0V)6|Wcz ~³92fM_xp{P~D8DgֵSV 2aԙ 2Qy\y~4*\U,e0If:>fQZf/ 쬂;KjL ImTqb_6B2q~,B*J]IqtEu"hUu$YIH]/H:uP$j^¾p /0;ReA1 z˭طzkoܦƒ!a0\ï'^YLLc(Ƅ|Uf uppZ0Sv³BX8xVHy ?~ݼ?F3 Q>."ED'vȣʟ<"%X44#SMO^) Ydk ~q04N+WכF@ ;r2d i2!KDH2z0A(cc!oc[wE:IUe!$c^lN ҴG5-6m1pБFdbWa8 ٹ.l9dX4u2,<d0y#F?U۟C̰0cBBbxE9y2i欵 o a2'*m!C6< -$K0 ˣ@ )^Ll q-@XnF|ed)IQOmI:;DN]@v\3e:3W͗˕93ːXAڤ׺P6Ͼ#I$^b%a;AҕpD/ 呯^*ii<41nn-W 6MA*xwdrw~u?'Au5c42\,W}4-Ɣc_ע?PzؒfB?$ îPWfy z0>QcE^27<aTNIZyX*TIIY ﳳh/*z}P%,ML!3ϧҩ otӛ ꀻQ"@٦ $JB\C"gņþu |=<NThlFR鸵 JhJx9ڰ8QS5;:Yk#h^: [6=Fzk̤y \ &de7 BWij<>ro<$oyEwtcq]/s:1SGr]۫ks$fWTqr6{}cKFvX[Wރ]Wv=TU)]ZHu &Ώ>0& M..Bm43w͎/:[46UA$ﭵH"zszHZU~g` crЃɼM ݾzxWxGu{^}Q䴹4c:_tP-O~(bؽ{7 u'WJY?is+DC c+P$dw<3I83W~ zMJ#9pοc,ĉzH#:^dJg-kSY lGۋ~ ڡ&/uyH{ʕ ~7dAJ\5D5 G1$9>4\[׸a {%C/KwGꮿz,ʗ(HgDqy\-c>ݣ듉Ub;h'kĹ}{I]vqW -` m׎8ǣn;(X/$ݞW4G&O/=жS0{)w$z0yfqxKYW̸k\}T:8R'4I< $caEE`ڡǰwiM'6djG>\{ Jvoje_,ͷuf)-$N"i ?cAĤQCo >^l#DX<Jf3K@ϸZ h!r:h7Uyl R6ϻ=\\yK/ϗ8/<|K$(yy|cm}*݂'F*v;`yLHF/7~>&fӊq DWmր£)Ke8.Q ;ŎlP@'g .>XnӥcݭDLYlob)|)HJVe+/y@-iu<&{%l჋zvV:gsT{&.}nYH4 -?H1O<ቄ·avABv$qu)HI=TN \E⾱tb_'VX$E:h&bJ(b|  'T0a1\u'qJY/GN9r/R:]y^bn 3~*\?ϲV`1ӭYL,ϔVxuKRgoxLvO;}-/&Ǫ6Vf$$&>2e|HI#H߻d=A!>gNJ ᧯@t![;efEN:IGu 0??u4tv <¾=qY^[yK7Z~aȋDy qm@z,gv$$ЎKN@!v,/AV"O9P{@\^ 8!8yy ^ogoˣ̳\t \2 E#Fkdξu4QWzux*U ^CcO` >:;bD\5 l$:>PD0A$:d-._M% iJg>|Vz!aoT%H{gteGZ͛k<'yʝt|HϥyQ>Hňf>`sMgnHatpr&!Ip0a8v/;TgՄHjwR| nJT%7y+BHR–cm֐H/ֆ+RUKƩr1YZ崘}3tοm ^v-B|_a]CC"GkOyK/99a7H9ofww}3t ˯;r$K]ZO$ GH$k!x`D/) PN{Ev FRoz ^O-6HŅ"Hv@")wkX Hs=@E!iaï,: G&3r\V+Zl} )+@ୈNƇDJoqټ)H #Ì$d'10pټKqt r2:-e|r64MsDa4#z R&s!Z_ эʍ~/pxlq>6Q3E'տ|ż]IE^96̰yhEJO֐-kH%`}IS"GٽZ߰1~$ )lhjD}d@aCiДZ+ 8&nbh0N1ǩ}紾ėpS|ǹ.G#eyr = 3%!~& > 0<2ifpN $T#  Kt TpnT][Iwͅc.|N;8Mx9M)M.[|ܤ[~ç HB JE1#j$!3:$4G,ȥ w6Tmpgb>Em.j1g:C:1,LSۡ&GUP&m+N}\1JTؿ<՞j]a+6-(2 ,KIt}u6bgcsH(S !;p 7r@n R΁@r$ " ߢPIīWЌ>]]&rvcBDȶh׈V?CLɓL>*Q*Zm{ޗXY[ܬT67VlM_ZZzz~>w/嵉( ^4m|%@ f6zԝ|`8*L'(UrܿíKߋ2B](Ѱ"]> gI:>ğONua2!O IB9estF)D JuJP :Ddq!rXvwv]"-=lZ{=y$-;<.oi1nkXhv{q.[U5bTl!eh 9\6,xE$ \9 gsR%ђP'-,@ݔ+96b.la⮜ W Dt圎:h k4fg OWC̖T(1]4~oB[H-4X<%)dq0ɻc@iǀ';R%N]hR3D&w=yNIux+1~#$\꟬đNEBАP\DCM%0O95⦐q4$?]$dqa9#TOFM7~TAJ $V$=?tMB&1## ܖZaSgǮF\j{yoeU|C榇3FmB~h.~5w ;K˭A]cНI#Nj@יddA'gV?ㄅbB".̱:fLX чNw,Oΐqˏ>~_8||m#W>%PKJKt4.@H^0JTR@" N:BByT6D`x$Htkg*QIIFdnH8ށFG#(Cq=k߿NB':Ⳡ:us\, !;.D: t$;w o׀t>kM}N+~ z/wg}MTD-+WDgL2HuIO^py-RFֻBOvCj<;s섌!MD_D=2+E*tى/gv`zOG[[p=iG EodGH !;NTQ^"ގф0_&fZ[+ue׍ q ~]}??C$PC$lF;HB$Hi v,}a->wiRB}RTϼ`>ȍ\0Wܘ"ĕ0l:r6'MI|jjQS;> |F$u?wdv%yC Bک]taH$9Fñ7*"dIp$DB"Dz!"i-8\Hh'8 W<_7O;?aw9 t UcNubX+{Pm]ć{̢!u0u?[n_vޟYC .2r?Dz\*29>e##vm\m5}NjQ;9g?PTz*>t-#jUo߆P$@Gy HtЭ[;<+-U^,43Eudzz‘4M ]g'P  |3DJ'4/'M-ϰĔқFa;7'JQIn)[4vy'&M_ Y+tފ# -颽 6.,z# IFHL$H;>8t=~%܏(FֈKЧ $=$4OuhߛY'&HW]qJ |SB)g+[xdHd@_MyӺ u)F }ݥXu}s!%V$!$ !%IZe@jlTA,˝kI Y)ɼJD"qo(@z~c0\D%xߑ[W4vD">f՛-PW"_DRc*SQ9JdF |M ioz"DMH0ob;=Qߎ@ Fiulew Ug&}M ЯviFRHNM ?@:gϛ3O_hP3(jI iD< JphPbS@D3:S&'m"PcML%kh}Viee;.;lR#\wj@|V| J k5;o4M }04|m]rQUPտSӷQvz|,(].H+L>WA<l [߆h8Y!OZľYm *;|%HѶm|ϰ+Vg 2s, 8P Jj馿[8|]Yǡ64: 8PpV4H1A,&.+ 3[+o,c񍕭MFv) }qn>'ltSHW[ʷ<m=_|i  jS-t]P0b[ cG.T mPUƒ |*pt/Oro5ܠJW4m$yGK3쫩}t/Wz>Z}}c"GJרTC>|Cl[=v}v2pXboȭ-&Z*1hTEh:5$p^ ksI|عe' t$YGWfVHmw9g0|2լDטuuJ|[ꦪ/=Um(̀]dDW,Hl\|9sk') .|K!ϲT>/o}xn@^ Р<,gC |@sxVHWp%s|6K.%jhĐ 2(QaҐ/c)9bCӍ'tHZ $%zГ!3st|.c\I:tACg/3eoz "Mqy $(<& ]R 9yQT^|Q %xJ+U"i Iy>Dʷd oǕ|$4*Ef@bHaBQH]?eN= M ;HW%1]OW= g@/J(z)eyHiN@> -tL?97#-FJ]RZrgq86!TEV]Y*Ʀ/FPjǮ/붓tFe@kZ*jur| ohQ8d-u}ޤ XƦ i+MhV+ʷp6pQ EõS`w5Q4͢( |/(j  I }hdBsM4"~^^̡>:2융5.'@!ҾdV5I*Q ɢ*8]VcQ Ǖ(ZJ&;$Le\\D5 hx׵m盪VFrHӶEȮ3} 4lj72LcB=7ly3nIg̾%鲃҇/O_~; ~d8DS#/'z5wH[ơX }"?` hO69t VIxO zᅩ_x#(ʬ2t&˹\|#=KAyO{φD6 ƹO>.lSݹ.1w Pn}*] hЇiWsS,\dmC=Fe\&ʸpڴ g$^4ki"ItRxsBz.*-=B!CyKWʻ:\:xr)Y H<T"|Hp;tߨ d IyN!V tS*o4+YDo<ͤ1V(G zf χ8/D 6; cҏ?L绥.InCb !FB|$i昧T@¡8 })=7X A"B_IB79[${}}_ÎE#E]4s8Vi roHWoY/dp<_yFrZzn$O (DLcLlpRVln}9TUO*o1W>Ê!fg}WqV) ZQ %YMFd#gʎiX2l宨@VŧG ڲd1FIM%/R.J9r$Jrrm-X+8)Wѳljp@b"HD2g4X#.O@3wSUJyW3c uq@ 6Hmmc 1׾#ѱBởRGa D$iuz]WqH]qkޣ_CO3H8xN6"Rռ! n g=x h|T=`}VTbty}wޙ;HO W+@+zkal􏀄%FF0DK6?H1yHv:dn %{70h~AN%&'DHf^\oYK3g'@B7DzcK 5Ū Yc}G{}7$>>@C0P}u *)yҡcz'֪I!hB *xaҊ'r(0`4m{qˀqgO+Wh&p5ێ^NSNa_N?V!So5H؎{<)#{  HȧTq@TwQ K4^, $&;+dw0A@"VV+T>phًTI&4Tα]&RSVlB*?6kCp lW[ꉱzz_@M4o@@,D> +Ym㉱= 4! .O71VMUao|_NDtcdz@Pmq=cw uݏڃd{@ʢN.HvHx %~}z6"uDT,tk AW ]i!q@"kW=P@hi>I$ aoD H"!⊇$I>s݈ KM(ڵ=sOG4O\̢A"9&i߻IҾ$$iqOW_|a$5=`aOT lؾxA O_O}ቱ >F6Lz#}ꌨ~Ǎ0Z"HRw^(/ i-ȿ?> }!~Й=l۶t$E $@ $DHq=|c1ӬH:sciDt!_j7**5Tm+V$eO(>"<"i:B\c:V-]]tl!@^nA.[ku w%g7#@+u'@z-0:J3$@(K^mb WՎ!@2GG=|,H1 )DWߏKBvDn/tJvQp݈)z!"`n!HgWeyKOyhs_H١b,2>|Sl5SNtЁM&i@dI >$ ˸}lQ]ڭ<64k]GY[R-*M~] vj,ɡT>4#+Gn Z|@y#>$!@UG%9 D҈2sӐ)J`#toG˴G? $R  A".@{%T@ ۯ__f+\.>I%Pm.zj<(_QɗmhNTMJso~Qmc:;IAD#> cS,㝦()@t$] bF*GU:"@k([5,Hfoe$Qt$ $2BQR"qڠ#q@:з⪎]7rtdqxQBHoPD"+J/$K }ş\w:e |<>oҧAҶxKblʈ/^7z.ſ8/6J@$T]-Olq񢩏|@-W}M5?/YVzćcv ڎ4uo|2TEi-l)"_xA"R_-#wC̣ 1w:g}3n?Eac;RI|,b2ǜ4łƏ_Xo.|bvM9gӶ7dV6> K~-ݢTL %!B>54ICJJ@ome/85\wMکڳ2b˫Kw#R^7;ߐ1$g~vG찌!m͆}h!l\Bjŷ77-^ܤŸE}8kHiD}u׆앭z7f^> i W$FJZxG7SfV3SA{)9LAI&x/U_s"17a A7zG:7kkw/* Tdf:Eb:ʈ>!Bʘ-}кK+ e[&SA]K fE02"! 8h|IÞu4wY|)ő8—Gi:GnDd|+ʨp'x06 B CG<#_ 5zw^S=eHι )C"!m={#$ɉB:n㸫- ՝BB0bJBQHi">O!}ē,9"!ݾG0|2HH|y-^Dt@_ԧq_&h1E3N.Sw ) $$~t?gZ qt Zan LqKWOr\vX«vޏ ıfRlM!KnoTr,.Kf,'W]@Rbɕ 1X g4uN‘v| t!'uA].AgB"IrmٞCH!c,w a\Uv(Rg!mrPs~$K!s ~w̳;wDڅKi9GTS.\uB |L9gD~TU94Rs:mnzpVdH5L䲦]H,16jLd, uj cs(<"MCr!u~āStj L(\1;6Bna<+Bܬ"y!!jN%H2E`)BT4 "$! oq4MÀ؄A{Bbo\!(@ņ]Hi 7teqEQ(6@yLNH_o_A)bPHqO($qa~D[0ď8>Iߎ.\/"N'?:R$2N…!j!t~G/ ]8׹O8;ܙ%?R]߁n*;.Vi4xQL{p</$=8cIxas n ;gY%LjýxTG4"HH se΃3FXľ?P B>AqGжqP?y-+$1.+f@ܦ> \VYdQN 5N^dܰLfC=N W &G_?E:N;GP "R-lj\HǍ1BLgⳲs|S2p9 g r>81SX-9(N-F4'ptFv'k0)y}0_K>5,6zY>\ }BeR*豋fiD8vi9G. ICna&;TCD|Ps֗θŎpMAQ Yfi4DH"  ~r&]I،I&IV>a[Yxc^4oi+V[/pdX ^~oT@ TąL~l~lr! cr > g:RqleCa*G9(6#XGjYVZ+4?Z&T.m-Y4 8]oYp٪jZqmAYcT14(˶"Z;.O$%90&r;) +w ;}"vY ŻwWx&#HH2PHaM5-̅C!嘐GduO[w,P:" AR9ʅ:4qzVWqԐ/,,[ejȇNHr+i\KN=-ȋ$Җw"AtՓcyYr$ ͣܦ"[%-w ϲ|8V$4n`XU?". a _K _ L+gǦ2Xe6)|aG72Mjb[sUtGNJX*sZGҲXܹjNeXs <҂;w5c+U;w$Fr$H *{89q9&# O b5䋁@HO Yw?oMqVzhZôMq)$ Kjw40z\o\0/_ԝÏ8#fʧp2[Blx؃X0o4tT-PSc/.0}sg&)ęsÇ\ϋB҃c$ek0;WYƨ \=+% u;7m+q{O!F[Ykd{dT]޹8 I[B6®-BU|,A-TDB>RPR"Zԛ",E=("tIfRcY|&.I$gg-2 iQcY] 3!)vBRH BT\kr 5)jRQ0$W. ь(#F=~}$Ep8"ƃ &`_UzCG~kkF|!M0ZnwM/w'O\bmjF$FLɏxqX ?ru /:^hQ]&r:-\QIP0)GUn^n n'J(HM5!GĐAܸ!X,||Fi_dؖO[jY J}S6lDj7%?MqϽv @v7 qo[t-vuL iWB I6'EN_NbԀ K4\LbkF=)Y,%7vu ;:aZ^/n[kz%9'Vj4JZ3h_*fNFӳt(>Mg= OBH%cI/]> pOF|/;.M|\c;Ir#v:"0W(I\;u.+޼ލ}fBH:Ʉ <|PRIG4ߢ҉&UBՓ&Q=YYyVBU cImSGtLWd;?uLINqc ;HDF:1+|'u+ށ}!(@ڀ2.Ti&wLRg )ЀMK ?) `Y `^/'r04>d$+%dI@* &I(W6GͿO ^t7(Z|\QmFA<yPwUxVAh?!Q?ԯ<85lDI>=|lZ|?Hͷ\8>7wD:_o}@gcۋsrݕwRHx8<qhi2XHQ X>1(Б-5pPZ!%(lW+C`]+KMD$B)dS&{,w oxϳloEx+H*w{[&,ľHU=UODxdPba&8BciMRIayxE"`A>%"M~ $Hp@_Ci_MW?l$Y&;2xN 쐇{+Cob9N< QOk<:Z~X1j2 P2*W;k gn <2Ҫ6ʥaOxK.D^Ċܞ4ٽFWkDĠ0m9RӥI!s,}7۴2PYD@ų/%+ϒb }k;wg;wn\]0 Ul(

    3!Gxu,1~^\Nɓ485Hw&su@8" .)rQXĖ$->)M4)(#Z׬ {;Uv7 =n^u#nz7SR{T $9bR&>!%!dNo;fcc~mci*{LƇEi Ix Rs<9GĢ 5G RӿHsMkHv:222u>H*k FRy9$ $\qL! %.Ȑ->"{j6zHͲ[/vζ]NSHPfjTVVmki2rGMv{mu-u"ўNF{7z_ W&O|0hqN٘B1 3^|fݑaL'ɖF,:Z:&u\i*{=Uԃ{5=4@Q@xS k%ͱ:x #GdvFSe {Ym#H|Ә$9ȳ{bҋaFP뒞6 3jIcN3f|ox#E*wTfYUatQfӚ|f-k,~x AVI!7zyA1d2Ȏ,#=U>$=i34ڱZ/@ٳU^# zM{X)Td $ H7N2w Z[p<To4fƣ__ qČGm% :y6NuaQ;_̔~%;NS1 ;6mOD)<*]SeP ,_?IS5Q2\A4=GH^vc;ݴ"e0kE4wee^`(+ `[lf@Bw; ^pHI8G”o}O)!L4󈮫m'D9sɔFgxdy\݊T#_̀kk[ ӫ*Ulbۉ6%ށhd@&)<Q6HS3̴.W!Hշ7Tyc{F :55;)Ax|-Qqӧ@SX:ì.kܹ3-&xK.]n0 z,)gFqÝGxsl@Z/8!H6 ;4,C}dueiC" ?EJTԇʍ6jTWǛ^y:EE[T~$pUXiK=Z(@-$q wj@X;0 o3jwCs/>'Ϛ43HR+WQvV|86ӭ[ږ!J"\$5|jFɬiΜ–m–[ CҲpHg iyrM_`(|`{ziחbMFՈ=!Cn0pJA5 Ȧ8MYb/wWJ&XByH5Cru>䭓"Y$۳Z7D.6ĮAjYYy7ϝ>} x[",xu]`KU'='l["QiL1V)FJCi= ''i@WJ-xrK+ HkDcjj>278doN0Ҏ=!l {/P`{W[F{ecG^ ]A.H< Q.O(nߪ!$yіo Es*h}dq'+υ L$]]+&q3U]l E)7/ƴR,mЭTyƋC` __OBB4\-H03LrT> u绩R ?G Di`uaL>Z&#(ZKV 'ʂdیªB Z"iwޟ(>JB;I=WFi"Y؅H#Hd>a|Z]Γh(A{ܹӴvǎAo]H7!tcT)rn3qo.RTKk(m&Ǹ9Ѣcb5 lILe4Ů/ Ecђm)4=;7404qcEL ՓjTW=!IĹ{5'! щSǎ?=! 2-Wpŋ?S.=I)S"*S+^KEu!/\ u\_˛h3;k; B $)$|BbqQ'>G1te'+(hj\mD;lXM;Xcz{L$+DKH%f:[1hOe/E.,A^Ksme d'}'z%  Mpcd)Q$!$v NNHUg#'ln71;XǏ_/~/@!ziD $efS?aB|ɖcm)׹.iHGb **J#YVU:@Hy4ɐ1)EaYHIczFľLϟC;j6Z>zF!AB kH<^}H$\Z&ǔ7OunL4"^yE=۹DdE-'P@!OqE; .N$IʙJ@Q;i0T&/:OѸq΍8 t6lXh F q#iDѷ24"KL!#qoįPoiD=K4ӕ6շL!UW4` $']H0H64 g% =Qf` *xHbω?ˍyʑ4cpYTgˁA g#婐2 /t@zd4^x臄ϫҩN,UӶk ɕ9 kU!_ UNO<*NX.F){C΄RhdP4;T#P NnW fR7$skIRZ}پ$HK+I㦞1^PMZQi+-dslmؾAmizjkw k8O_a օ3GCpD Kj`ID:w 6J7H1` 楿`]]K7qA$dT.ɶW.GpwX[$l)gV4_hx> i_SՎ5k`TG8bgpt\,3~ Mlyv E)IA$|D֞${;izJrb@rb }@jVIiU}mԽZ.HIU=-n8{XwJ)=pdcϛNdT)SKɇ=Q˒^;[r | @7݂;u s]_1lw?hВ{, $ɜH$̹GIʞTAѴs(@ x hO!ev ={u!RlYg͚UŹe'Ut{*〽eO=R ƔD4H0#L9u܃jbG| " HDq*N>R9}Iy3yԇ>CG SCS $-;H$9Mf v?Eaf#OeI4b˱=ZQzv:g[Z--{UxbxhHgޝ8v" Dt<y$M놮S ]u䨢RWmDzj>-HyD} $.@G"4B途l{H-!9) ߢ-)ݯeG{l2yS.੧r/'g`n–4+tT'~Nui%4}$hGHB$ 9I2#R7-|۪$A>>5v 5\HN4gR{GK%H^RLS1+'>Lqn%LE!{Fui[kPj=:{e_;>7qݧObrIk'RhX: DPj@":.OB_{Whـᐶx,x :SY뵭r_"Eׯ_"H~-.R\ID Js^f䵷4[--ZGmC<<\"pc~p")9z|N >b'?RN¦Mh}@$6}$Gx@wk=0x_U \ϿH!!S>l~]u6ĉF҉aU~w cnfd\GR㡻gAֿ=H$ je.(#OIpW+@"mL@o?iPfj j/cPq a}'*OU'̯(Q0 Cjxg[N9ALh[=;C֐t_9Y qケ-t9 j0HaR$0G I $q"4ѷHめ=dx\ $u< \` ]@/QK%|?L9 I?Rþ H8*.RT I+;L{?46]ګpqilK5 '~I|z-cj~0~![*:Y|By7T}t8Nc~ M(NH>`u^Ѥ,){ܱ Q 4o6Ӓmnϭ08HĢi>\N`b_3G gQ:t!32z@PCn*/@Z9NHzy޾uVbWnE%%!~)]|S1?ra]˗^Aݳ#+7H9UYmGXIX¤Qݘ#3SL;0VXQ|Y 5,$9ڮ`ҋFHM" nh@)1#PG&cgjEi;;$ԇd{:bߵHV{%$XlFLIWDq"IE?ykg.X~萕g H^HГ>{<>.N-7hzlwYNFSNVy.N*r206dY7 AQH20v\TG A]dd`,HFڵX)B[(o?Z~8p}rmqo |h+XH(C`rAT—%\pڢYG_QE㐪ڃyc]+.Iz|p<J|%ŊB}G$Ex$QH@X1y $=$6. Hn+@bHH\uV;섣Fo*DtF 96uĈGz?=ӳQ=r+D'`D)KAR}B E]H]#.$lDL @2% /K,юSHB\%c @j.>1u>^)؞z{Z={ʹ˗T- NهVvt\|y^8QkO}{.M&/mId0MLZ㌙z:j%7I'1֎"O/5KĐAvQ `7؍;9.8uƒ7<ݣU !Ǯx q߀;y1~dE:ѝIQܵ<:VTwj݊w ^A1$:Jc=qᡷ H힠g= vw; eHMl mȿN> ATyiq HL}}iz@"' |onIz7R+"&kB+%lOR>uC~,S]nh?6u>A]IB4pd}Hƨ驈d x$W5'?jߊE^$\ HՇ$nB^ho$d3B ގc/\[_ӿpMX9/<S;w* VEGy`VMƀ˔@K Cǖ4y#.gS|_bK[Ŗ$W:@!U-+*Hs;WMf#t|[dL4[җ _vq O`4 Bc8 `!!w}(i=TBp@j|g\w/L|7[ ҪLxd;x`l!;HBkLnIb8eHswحkz8j OSƒ }ġhlݽ G0!EGR#(ΑX$>a}'cVoF4:w{-{S>:#W Hs<&vx̵N5.o@>$iO $_LŔHoY2˲B0tM( \-Xd4 HA`VcV rTVz5ZWN@]΄YkJmbR}^KڪMZ5|㰑)),(.v3f@ڌG?'ϫQ@:TvC~;֒WDGX+чd m޶m95Ҩ.eu]Puoc_8buofG'_? 'gGx]Ț 鏰DA}H\=i#^Fm_qQB0уHDJq*^Lzp |Xݞ@{C?#F?:lns9@jSeK!9:8:pJ3qo:qd}dfҐW} _zX8ʵ֨b ְ]no$hgmˢK+R:Aw HhC AP!0A >ia00 i vdR@H$p-"%d= ~>0'=$ > 9MЗ̱r>䬭nfHY9k=}~b)4ҋՄx sfDyVMȕR&{X~i "M^y9؋$9ȁ}_2^׋?d&! tdrL%Ljo- >6t1rq#^cqHr> 6y\ tf-<1w[>zVwRdSt *SHI] j$5{YD$7\[{Ҵn={1{) 1k,%qi_M#~A_A-vJD@j&[}Ha$5h";iN\|mnyi7ɿuDܵy7A@_7 i' Hpvn8'>doN / t sHdR6 6SbpLo`l ⁱC>$ Y5,4JD"{afœgH{9HbbHc:ǎ)NWxoZr*.v,d/NsbqibEb880ܖPnhc\>e^]\rz BـG;8E]i/ VҬt h`'&9VD RYF =Hj $>}[A3hЀ 6txnH]oSyuVն5oϢݻ'Zz< }7g/ u/= Q@j^z@ _I Q@H}^$K ֥>(I%cL: Ylesl&\hHAB"ww]]\ D2cI"A$cD. SC=T j 1]Tv׍<*UmI#&Kl[֬n]s/ZfK3_s"` 뢙Nуۚ83j?&DI~GAQE[.#iڟ"<Hgiyw|WC铪2YbwԶ;]f.g{RJ<;6nD>҅ߌ\l~c{{HLh, ]|(o2-!2ۑB "Ht NG_r~` |ǿ b CY;HUHfa7igҀF> ˝m5эSԊEVOzEǺbѥ#,V:=bV/}4_Xg9"uW9,^o_ζ_lj.3>PPRW XPHCT<$ijdǁg$m̽%_鹕&Zz5 QCk$E3ak_;`gB^bRJUuc̏8;nnhhiF͌x5LC/Dj2<͢'kt[VI)h{FX҆G\h1UOC,,:PK9-̻e Ybu+Cѧ[h{ce0ïtFt9V4o! "ܩgE9yUhU 4q2CtNb!͎48WqLPfu@F^xW"EBtE}(^4,?~*7$cp FʵX,F9,2c ?4 fΎ H1GإՕ}(;moIΫxQÂΫA:]l0_k+E6)ۓ9hB N#"' <ܞVYؓf;½;f "'RJ fƥKgΧ[^fa9Ȳ]o!U"n$ yPICP| ͵nW,pags\Qg`ի AJD=;ѱ7ۃROCr 9SHE{W -P\ꡥJZqi eNAYڠשs*JLFpfP/".RV~xHL#,]ΐG>jX F$˃! ~n! ˦hV ģ#}׮t>J\9߭rRJ$P`% ʉHm*4L 40IzIjIO gubOioqF~ګ Ms.clj), 3f(-,L"~i7"dd9{0kc8cS"/+$ɠQw hDDr2Ҟ8=ay%de7AS[iOhZ󰇄c *@g#-zNiܻ$y{{x^jO)B}J n Pi97S69}ڤ㿱$(;=K$[GX!R-!^x"-i CK*!*4;;qvxaq6I)tY|q]H٘7 ۨu t qLnG~EvH5N}4T˱|ic$Tz> Zhǂ)ǎN0#mӤcIfLP)X^RJLKJ))Ť$=fB,߳VI(9N_!ۋ:T($㐠|JT_raI(<,3PҨa}J3WQxH)rQ]P$[rS ȍqJ$ήV+ztS& HP5hO$=F Ɖ7 6UbO'7znDWlƣ~KZeVEq֖5I$͘cA/D )yx HIl /"/H  I{) #]/EAZ&()Hbjg5ڣ=KLR4؈k? !./qE ʪ@'ApwkYGl\=r)vH[Hv 0D&,\bŊϕ N˷$$xv+=m.uȑK/ {@⑴.hܬQ1'*Ϗ <+SOרz0-Ox Tt ,e!@bYEHIT÷#`o==K)3?''g>` _59ƆJ2eEΪ ɫD\N:-M' \LzTapElc6NΧLHbO  ߟp &ctzߧhoɣSG#DB8~?4).5..^kO 5ѢrE$)rANEIͼu|"#hyRE AsďvD@& kKJyM~mT )%#*xpwl`A($Y2j$IRMb` ={$:` 3M'_*{;_{6F6{ ej| A^DbOQ6 t&QˉFm 6/H1Gpn$ c>!)8LeoOO eO, DTx$HIԛoPw7J 4Y^IxN2WB|&SKϞK"xo MQ7܇r}|-3jw:g/|˧_zaXdGzHxC.T5@YΞ3Wjx8M7bň(eİ`%ZeF+; Y egHNܑO>@ \.>x~*48'^WnJ*=ˌ5/DlHM'M_Qu,'H"/I#=꿇fJԋ_z^y?˲dMTԊhnL2UgHZj!xH*(qϐl3H_xfH9)qu0 Po4dɼyE_bѼy%l:yTq> 7Iա'T4i ? #Vcn%+'Q"e5iMG6z`/TRLHD"ׅLi0 [ᕔr`F̷}kؔjyyQѹX|b* -Y+Zf):!hr淜2{:_ S|,m5?$\d[I!˖,K?sQŗR$ъŗG_ ~qn 57iI1/3c%fv6>U9jK .ő&<(axw7O Q/um)ky啜Ƌ:s"Gg5Ē Rj-^ aOʣŒF P o資VuٯFYH=4>b3ްAT!4aVjNT71!|%ߍDC;GVERn۶K.A9LOrs8w.MhAy6hX#Ӈ# jiLӎ3 -jKmqekH660t B}LiN瞽{>v0 WXTS q*gxʴzxeϱ3GXaYjvCo4`t0 <fvj)ꀔ= 艏}yR 2]%^F[ڽ83iJ 4'9p_ṚB-X,3s.D@ &F\oy8ĵH=Ի+sÕRČEr!ksiovw0X"ɝ<QV0) ^mT D,oǦ+z6Pt籄 OoWOE;$էPl12̻/$`owVYʸyHCr(iB9}G_:%B-P'H#lM  &nDxA3%LUZf +CWS,B/k~mp1㢫摙HIҥOXnHbLj}-Xy9_L1-BsR_:fCmji}iqAtk@#WE`"I tx@jmq_;u$@t\4*UU5 0~x{!o$ ;ΩzA9b FrHhIpjI׆e[ۗR$' EX8LI#V>*dSVA]ozQgT:u.|Jgdm>2RYv^@yb#U^^WW~-<`Z%Z&-)T+*I)㑙HpO^:xɓ7 CJ%KNiPۮh^G;eΦ G@F/:ohTatA 0^TD tb %; 7T$k H|@JPI}h@*R?^mhi$fP\!RcJ"IrE +z2=Wҩ7>+I|ﵱQKo}x+37 $@YlZ]ÄP`o{&wi )+S'\ޞdsrB mD'Vo?td#6H;CSٍ@z,"b& eLՌ#vH#ֻǏJTg $-RT&%|LH$JC?x"g {L\=B8zOu|Ӗ@YE5;^vHQ9:62-:b#%TWQ X;P(M[$%h( ԬIpRw/Nm'5)&R'ZT,!7 yq_5ivvz`4*2mcҜaX֍˗/X+jҔXߎ WZܴ?fJS!Ǡb%'n0wGͬ)F"\ܐj . jߒGRw %nw+c u9mWH%$/^Vh;.@0e78te<^ %}o;/2@?HHE[fG#6H,ir$fIv-ˎgձIA,HGtĬK> HΧ *\F]iY𡨝4PҖo$Ŵ n)w܁N*ź$8.!Ĺx t pMHEjIh-2r)£:E22Y\t8҇h69 F蔟n@zu sRkvH]^R2w 0gآԑ*@R쌫9nϢVXCC5]o֧ *7xt:xar9HYR/23i2WN]vD w . TW:6w(R9@2F Hk3ܨvk)::LVF; #6H{Sx@޼Cz^$I/@z&Z7thHO5PRЍ܍ a[H[]Z};w `Ԛ %) zkH=TD@fG>;7l%3̳R#R $];RC ǤHvH): LZ0V9GEHH*[$u&lo))e'VTo>{~GTItg@)6Z#:C :m3̍p? RP3i.C_\ţJuqE =㨯/ۛc㨹]Yb)xțaFi`#8%r-_7nцc`WV0V9C& ٛN. k /"Dʂhi$Kc9M7(-EшlQy4Ssvi檙Қ$3n[MiߌEQ0agAki#}%w6qT"" &;i]v}]r~4v%.LQmhg=jfjGzAy{ y? T"LHC,]p\LmͽҜH(H=$0* a߽V,EVÖO8a>*"aÏ)YvvWmma<5 ko)a-šg~妛0.>H"u؁$u>ΆVg \]AQ<K^C.L~~h#V9&5@15;Ԅ]nixW{F: [0<ңc1߸kukHT$vp; ߅tlЖl8-@:]5nEI8 kwG5us$Q0D^a6h{ro3WJHz5ybRC=;wrq*b]D >KJ^]¸dkRgg|rי.<|9@v6=3HNBcVɜ ̅fz>b 0aK{! LivS} I4'b!M"zj,OTJc }w<<?cHxWeT,44bϞ e{[obſ LePmR 6jh12M^7<}oٺEaٹ./M$|Z!VEZ{Do?Gl13މcz="o42VbH:Uy`l6rUWfү:up_',XD"Aoi[UJSf鈶quiH @b:~6\IAh$,6OϖORfڼ%uj\yy 7n\߉qȶrs:G R!5R;) G"8Ua]Nq6P7@BDP;v,z:s.Mt\E iv;)@v$iv5FM@٩q%$_" l"K IZBHjIK =͙RF--phJIj&8'@Z&"@ZUb{mFOsicKST3Ɛa 191>E5~D >Jֳ~3%I74l;$-qm۶]E& {-?k@}KIɰs&ֳe!+^ҬFJfy͕ GxR$ ;ut 2#IvG HŏlHuGH E 1c?<.~ʪ ᫾3Gb< M3LQyI;3e1Xfy2T$j@J to:ؾbG]]On܋]u$-gHۀJJ_ɐfw<.$nzB (1$@(#] %%YDTRaEG" as5H BHϝg:H#=][{D{ha }֬S6 C $IR:A 0rDGUնMS;Qպ0MDjS<-"'$Gx48` "{#0HF=7ut|$ G0H#HRLj@8: }Όn3fMȸJ2t]I[ذU_~ad/SitH.TDnݪi}"W|I]^"2i2G! nz&|{~'삽`șǷH JhT Uq Ir1cll?;@f’;|mBQs;$kY? $qf-ᡱs0.wC_;: )>pt]q;Wġ!%%@I>}:Ch 8qbuA$)kjHO*#eY G@`W${AAqjj+D+dL6"s5v&*Y4L:+_I呬T( %-EݵԒHe RGss6v(;:";qxM6ݩѝci"t#r&&J R:H&Z!GMHDzgj"Hc`TGJZQ'އl S.$v:ɍ<#AVaPї@+3rcQ&DH&mUy4 FW>ӜFYe,h K7IZݗ )EMw>b>!4<du8<'Hg0.β}@Kp]Y?x=)?\0R)RtX/-@q_GuH;$D$ f -mssK?4۪ilj ,YiiaGX1LY ,bY%> ym^}Y(t-;iQ8d!܁X@RHHoG HHQP ##@%Zkm 9_Qosh7/R J(Ѻ cre[7>H6dNײ{]ײKG6ꨣo;lDzo',Xh"a,K̡m'EG/Hp[T Dp> H`(Ժ5Ut쯒bWp={&OWd}^ܺ7QCDGG,x|[3P98:-"@w\N&Qp7bGMpIDw0T'7r5]4 'a}|x_7ԩ4D'\=2|yšWLo{ǡvbHUxԃ3$<[-;)d[i ㈻xolvX"lE#@XRF)F&ԐH I,tYvQt) _PtzOXa'@"lCjH0|4|k41i2Iɦ`VDbd5M4;Coe@ս7Ty9g`o,3 G Qi r-_٬iw9+vᖫw\V0GZ9 # /_>6zi*$@JXo H ]vCN84{Ԣ뮛/[vG )f 1NtiJe$HYK!$HRMB(]UұU $5MZ&PvHӚޜiRBY;` o5$ XBI,Ү[ Ad!QnxD#hHVӝwB,]o[__gyDUTSD>T^9GODsB$09$Ddz>*ŃŅpqUwVҩKS">pvG (yZ" ODi׮Mv_Z\ʲ }xX$!ɬ8h2*vIv;͔ixfuvW7y+vH $FQEI$k k}!i :gl$Ejh2)0m[pO  Ch692B|8P4倣G>d:]sL$c]gRK'~/F}4 H}zq?Hd@Aj]:? 2G Zuz I2A$]c $>5}w:ꮃNK  f"!& $h0pOrHed9$/#1C{ ϳ( =V5qH`5}Y@F/l!t&:X&Wg(ZjyR/(՚HJy %ډCRZn:Fx[ZĐGMFH@ zOa F3?AiWNo|06\1)80:,,ў9aT Sk@GHD">vGG d `nDŽ |vy;Ԡ Y<*6w./TZK@ y@H**&`@.[x`M쁱ӣ# $H#]&üm1ƂG$Đ&<:g$MP.Nb' !x!I+)vl YJ &iӎMkn6HRK1H"R,8$lq\0Ƃ>'#vN_p= o=s=*;z&p2$H-$@ͣ!pWXT,[w\-;(O3e~_:(H#`Y:,nP;3UsHvF#kj!3iy PE_B;a Wۆ԰Uj>1nDz8(~dl]52Ob2j "nvB$G IIw=ϭhŘ&iWfԱi'pF4VECXcD"ay+I 1N7;7hfR*m#>[ٍ!18*@Ҏ% `L60)$ª(nje1~-picʛ$J7jfȂŋk2Ϗu1- 1GVDua' 6HbdO #lm4 vmZcm9[εV#%-`FbiPl[f` 8(^WmnfW(_jsΗd(yYwaEHY@:k,}G}j̵έTuۆs7窛emY'3ƶ4Si5KEg~NmK@""I!ڱfTG>:RVHdNjhky/.!Q>#t tKG!+3SuH="Y] _+Z.il&HPڹ$$,qW1#Cv,C!C;QeA3?| )uyeJVtT!y?eW,jD'1#lv+d][Yge AJ0Y+bgbWDF7ӥՅIt)f Iccgى%nO=jctH!goxA;$i5#&JNorE)vE^:s< !raK4"ݓT;Ɂ; 8Zlo [C{ml462<Qmc ff5 LX$R"䪩KŲJ`M[>#X TW be~H r@>+Uqoq*L@ZNjRUvoJݛF~H;cu;Rvd =K|=R$BH^?(5C FͯExH [AJ]Ng,m"ox4mÏFlO<#Nm#H }b:4ىHBej ǖx*5@,;yzzY .2evH s zȩxsѝ\'aoOy$@$G#I"K%۪V:) |k୳[(k X b@&E-d׼A.Z$@ܴ{JcY[Yf$۹Hnsߙ&N$H86^/c0>̈Xf?[CU]zrrz] <H'VZ3:ng6ȺC3h}t<`1II:퐄 _# ɇFzf-ՁdI]5XQ98$ѷ_G>Hc?,5WuݣF.ΛQ)9 \a.PىEeʍzP owVګB $9 ں|6K |]rL&RahfEEv̙H(JH:r35@.WN.]zo-F5SDJ#7:+ݠ\@%4e#ݭ}0zG]=*uGYh2#KLIvlOۉ^o`kFoBf x7B>!^@u|.@G?%-9Qj #H+c[92)fu:$MERzH7Ch7q a0/9tqW=U _DI|*kpTfB(;:R: 7^,=lҿmiMuz@yi$HpqlRJ}"9"iT$CbEsn\${cA>YJf)iŤ׍F?hTn8$AŠÎڰ" ZQۉIxG?ڞH.; 0GGIlC$Rb>BVV@6Le7Wyignu%V/IYxI㔮 wOm^H2CcgI;W g71 C($ QWNB܅S8xJg4uxBϯ~! asbZVn@);躽qqۺu}4e캌8z! >3 6a+ AR7GWI"K2q$iv{i8>[9u-q>vMĖGev{͉t =FeI ɮ ]CVZZ0wҔ1릤dfKK2S".Bڞ8h&M)1ItƶHJyWU+J,[|dTRE5iHM}"z~ RPyװq OøIR |7HtK7I*&kU") V/dx5Py}67Wn&)qh!j<mG{aD9I}_uXh&)\#eđ7GKr AByӦJpWTOb`>ؤ=da]cd!2q>C%2-:EY:9龏 HDĤL&A<F]j-A>5zj;&7]Djj骭ښ ꠂ eV67o+3ƥW6o\}o+ §H_Ii:w h^ts8{3yYy!{8{L[׼jfJGgد)Ůլ? jާY5?9KқrI_ޔNb\42i=+J}ngnJrQjr桬Μ$w< -@@h@l8~+,Z? mܧ7c l,k_R,gCS3W%4IMhzq5>cѶPb+Jqu;+H6·7'ǧ,ڜt\-Z[G"Sq{.㪕*&9%i{*E*L y^᪌ P!#M[<S^MXVn-KqDgC G4Z+\]e+hMʕAОǿ}#ះeKJkdqȪهsKH?P#g)S]/_~ ~ɐh0MV(@5۬O#|*mE$DRl zȵOrɹqUCߧOBrH'8$)Ǚ4&)U4&U Iy}US`\Ti7]Ҟ _W֯U  Z[˞~"tw[ HZ~P[h$-ysb+{ߏA \1y&nZ6^Hz]ypk6-7m3xL2$I//eLHңS tCFEڻ^'Kc/ucBF Zs54+]Jc[R3b?9.[)qEن 6UH:XV {T_9-Ye|U )1Hr ~ZZةyd6?;ښ8r")}P!7DSԜTơ2,bLw^ι0"j#HLojmk{_fb! o #YYT3,i+AFš9#+Ժ5Qlh /'QٳLa.Z^emkw7ԢR&PB[@b"RYۯqh:|.ٞ_rWɣJ$9XøPe{'&j ^^IږɟMlEذGĸ{xx!BO.v9?3qHqb& [ÚqUBhJGA ϾyNN54/-^UQa(cw@rH@- i s4',H\.wm~׹ZyoB+͡,F@( ϣ]HRiuvEWb 7J D3-=? @ [#u3>V cg6uJ{H7*?TE$-2ВɏDJJp ;<:xM/tSz^7CU ! 9!'XPWLe+V 5|Z֕VUt-d#AӉ4ӟ HMMi񈆯Ta_)<Ŏh tDnPx.y+bɱ\l!>0Bvx =o|ڥ2]%@;T#uIXzIG:{"aL R:&OG |6F${1 -#}Ñ"Uԓ:Q7jq2:6`wT0_8EMf%u"ڿ.@b;SǏBǏ:"izF=m,GYFE!wEE@4̊ߵ>kȎD5Mşǻ9o &76*jg7iv;ezaQ`,#WR!UJhH,&xи3I{l AKsO> @]]@NKU8g 3 9n& x""sME^U,@DL~Sa5GQ]^l0 HhP _ШH8/c465dY+4{HekIIHTdEL4:"R)+KH':9:xcQӡZI(i@:s!ڵAʠAE"oWeF,WHxԦlaވlDe`Iv$Iqpsr4@t GB??n QC>I [8jfX^gtdy4GyTԚJ#=wh~G;]YHH]@x3W|/b7,+yzzN8G2mŁEJ$- thy:(ϧK ٢]cA(qin\z:CvKoxJ9"VAσ1dELdݯO:Εi;sn8=`7GvA;1s0hSv<Fukl?Ifw>AFe8@,ʊTI#ppfH$;$ d  '> PQI$ڔջk&.@d;x݌m{wy,SDSE\Y 򏑑 KЊ8{TʆG ꐝ?-bM!k`7􋣒 kr6hewHh,SZqEZT{)c;[k IEb4gҶ6R^},mͿV/ir[$M2H;A={Di**ʨ3P͐$vP.$Oq<"@"qA>={#ѣ{G# 4zH CEbiOwHgDhckqAW֝#HgDJF.)g8:-d CpMM6-@ʢНIEoᒒPw -:H_ 8G$w@R4;UЎ& toDYʯ qI H1XM*-cy<ڳow$TCY2GMCS QXoImA ҕX?pD: ][T@b{/ $cuy=|5_x42ŢtmX%*M]L'Iq:FO,R@ KEGd3:j+K$x( -Yt~H5SSV< QJH*T$ dN4 2+,<"cGYv"l@o"ѪEJ@ZgF{:ZCxf愊۲HH<2H|Кl=Pѿl,)s"[!YQq$!ӆ4l-&AN 3O+Wza72N΢]$Ÿ]!bV+=H $?-W!}@B׫C%PZzF3'^_%+W."c+a 5ȐM20(!ŴպUKFrL_O+`=}wÆv:{˺LK:, .،G(Dajc=h4…htqk a\dT# O:hN8u$@2TC;5b#1U"vxpTdqN1*5dA+iӔZڭwI8G$$>9 H jVME#JDF8zKw \ 칅3Dr;VTY&֐Hs&CcCT5@^W H8 rHj .@, .]1 KcE'4 Gt U?}8wN=?< YBeϯo[@"G7۝x%b<)eM*a$l@ZO8Ꝺ4}Cνw0/$R\Ɇ#kLtf  &RIK ,Z`RI[gK $ $HH,}iegΔg:1B . iZ N^=SZ7:Z{~o }p(zr+7$8 UQX7 @3jvǁ(*mRR/Ȃh0щw&sѳBRI6Rh'@r[mR@*+)KpIJ LHS SɁT @R+: jLe DWc =D[˯+B~$ƑެIoeWDB˾r[l!JKOJoځT&{Ղ% l%;}C|/ ± s6RDpH"]0g @"alO ٠'ExYxY R$`*6 CrM5Re]MMѴ#zTm.]iWY@d$oґ~ M#qHn ?TI-wMGaCb/k.tOX$LR&p|\PHgz1C8u@B7"aӍier?ZӳFS I\ #R,j)HfCTvH˂֗ok]|p4@P>#{Isk;{6:{;ME fM)TK`Ή=K"^Hmltx]QS G H !$ZР>&YLK/|F$Ss`H )/ӷfMf5Lk' E {yt amlxR #8|;)orI<%㎢x4AU *C7.jK\)j‡$(d\>퍢b/YHGw rH8%wQC/u7o$iE ԫAQ0Ju(jvTU8|T.צ{ܫ[<}IR)nfAJpHAƲv={X[X/H?Z~CU[+OVߤa! @I[HZ;ν ]Z Ly@*jk]ߴRH(lh)@B`EӔE S{Ƣ"bGF]C&G>yfKRD* RNU@6 vfMV 4䩀/PNx+y* }s:VD$_1GV\7Xʾ ؁X6 HeߨL_@qq@\4H\aψ{}Bx}sRHg/8GmeC?o rb, .cۍD*Qʾm0\Q Wot eR e34o_\',R} dDZS51v`YI&~"Bv6X M!9Zz#h )t&YR!p42G}ySȺ E{c- 8`RSQPk}wL]s\fIG>p $m-94tI#s3z%P .-]rXA; QͭS)X6vq L5#x$` GF`A+u['>ASS2ZMɹxt us5z ֢Paz*kQ:F؞Gǖ$}oW%ou]bjty'*2/?wR e6+~ aP%m4 a:r?D%a׸Aa4Qذ9Q)DdJ?9dFL6!M$)qchFuA6ĭiЁ$$[5ӊ}ZffU@c#D!#v;P@ +dW)+.[Z=Cw'bv1pyXZ> `]0zvAdtu*[Q;$=Kޭ# I /I H8uBCyB{ajLj5WCS7IؖRsUCJ=$a絮#i 4 nƉG}ģ9sS熐}  i͊#HCz,9)SʻQ 2!;S H8"'?ez$NqJ4W,#}!$qaJ7j0Uj"-@ԨhHp47Jos uM`LLhtu~JsU4i'Rn O:Zβo\1G0_5 HƘi=/4ByHw*K!(8j*@GpHTh":gq.Upyd+VCӟtx_w }}˷FDz)_~͙t"'9ԫDH1= 1UAc?GqGzqG2`HX7ㇼ^-b0H}vRHd8 $6JvyQD@"sA;o Fi" 9BN@ GȜ[4yҪhЍ/?Lk~v;ߑggjiwLX=v!H{;>b*d̅e8$O8dGSQDe jj3DQ%rGGR]~N-?Ɂc6HwJ'Ht auT-w 9S.?@c;.֖Vfe5f1Z?> I)$@2e_{$zEH l<9q xvHͶR ]<"O4eRrYI$$uJ "un#IIHFo%Q @q,g.ЬU7sc#v QpG\ $H,'ь.}mH}Rűtf?hEǐe>=U @#(B+ 3}ԵY2G"vdEQ}3z8v*thk>ouhMS;ǧ/}׉ wu+:5goX0_^21.a.N )8RO)$(X-=#v}ģ,L.K#S$HlH>K"؅iPp uȡTN\XՉvǙ@}5& y@Rb٫WbI5$"2Hy h`H1PI?<$@Jm sFHL$ "RHv]sS0ϭpX).  R2J%̹}a C y,a^+p 3g*s-a )0sT7KD,1H{BvݳKm-xwzm<-CBvmD'‘H.,oo;~a@~jA##@Am>k=ckհ-͒N z )5$J!^HH!y !KqZf^HBoz$/S3]M;\bR.j$R MG)ϗ{<(A k)uSs/ޯ֡uT3Nj6Bn]}?(X!pwǓ?̅ 8#'qN }T ~^d,>}ݙ鞙2DJmq )y3JRb'KyH=y.{yH|X.:0vC*Ltt諅qqBq"9CU ] 8j]8PS[ ֺfkr$*G7pP W@ԽḅhbD+x, +p$9$a$X$|J Ъ,OHXKhY SJ\I5H]5CD+rH; U "E3LjP$iCv߾[ˏXҬ "'4fn& UHʠDZ5<"fQYjXpLA# ᴬ~2#`W|k2f.#GAWWe\C( v-ҬQe*ʸ?c|ZDr(q;= RNMSV@1boZvPPy#tbvQ9Ahģ+ވv"HJylAQ8#Z5;7Pir n+x=N{ͣf #7r22JtG]+4pN Jߒ}+K!Uyy1;%E \w7otX@wY]+ǹx(Efa$`HY? vVg:kUbv1"uAX |>{}v/T] ɣ*VIĂR&CYI@[m\0<Q׊nwGо4Lqےdx$ y$D䑌#߫ykP鷷>cbЍ7lXP$UMBQݤV@(œtXrW##uoI+zDi'g 2Mvh,S9\'@ʗ+H%IyĵTqjDz$x$vac:8ރɽ-kG9[r{nRL X@.-56 &uԺ.s*`33f6Xke֥3$ĸ}s}Ώ1fۗs׋<>/x$)錏<|uH_'L,9vOOEIHxScKlLi-Rz I٦0[j'i&wYA9qXklY$*?}je+!3]oQ3X;[mj6h;(˻Gg!=Xv{׏xxtn#z^ {Vh3  U5Um iw`j/tݱf}GQÄΣ{#n- pi\򦏤>:F@zָ#ZГ7H?͞@Af #D F}hNcXH-„JDf7 CdS'!R:6߹$%U::)Hz$X @zFRC8)5cQN;1Fxq* @VU {[|0o#L:X&$GԠAm;6Wx$> DIH8όTĤ{ H]-BV̝])\ğf!誓O-ͨЯvA!x43PF'TaX&8h]h}IW_i4h|jY-zVtYT898"޾xVxQU%&]sZ|u*_riקR`:HR*HbIt%IYڻAI$QqxZ95*v`( M(n05bOlGR#$1<}W e1|Hӷb-:ZaWPZx? uNsWܷksޕё~?|-,]H|w?Wjֻ<Fp@qhU4hڰw/Lz̬|MP{*zP׋⑀?#RF_QG.QVuVV|X2Z7&ͭш% G,/f*Z5Ά^4.(o=uݳׇbߏBo_' 𦆆!|r65հ)C|Pm˺y5&@BHM /s¾;/߼ְ~F?w=tR/nŹ7~ |}IQK>䓭z;>ՄC}' hEK Lm:}p{ =":[ꬷVb888{>:<P y'=$z| :6fy"H`Ѿg\R_Mȳ,SWZC~!5+@MuZWMa>9ŶBkkjnj CɚD`J#ET00W˅OVB=>03/HK6Ff7&3% ?YY^kknjiBO_Sm*y^6n p9>nOzH@mƓ͂`ʟgěN? '8_W . jvi}#:zILG<""݈[\HïlQl@{iڑkjީS} !M.Lغq? ̯jUꌩiUTuUCjaR({ [SF ;%}(ǫS.%/_Kjk Sjǀc|y `8~ YqUvɗ*;ɇW=|R|SNqW)Kr}ag}Dz@zKH ̊ g[zs?aëhO=H k-wQD5"oI/kIV>q7WGlQoٲV <1}}NW豑J,Pi%`˰| Cdž X^/-#8}J}SO=okiq":aÊ؇D26.Bm84jK}ġx/%5x$_5g4/,/mVw>ϫHI?5٤w>/lKyZy^* Hgg]Q|}|(Xwe*FJzE_ިCB˧ Խ^Q#XprבS{Ԁ#8$HZHK=3R1<[[ʫw~P<]NN!;Pd_S,;!/؈ߺѮL/蠙 z{sL!4Hģ>jx+/Z̕kSzi}*sn K!m+_)P[mLšYCkgD~{rtJĮw1<ҙI&=R*tƫxTrKZ\hbKuxoFؘ#vã~'H}4eE>J1LP{qSCqbbs:Đ/_ :iaM(s$ ;dD3)fzĭu  a9f,;!_F ^zCJ$<6l6l؟{xqXNuZ/w~~|;DS[XO'M+u '-5>=뉾F:_}qӳ3w7oAO݂>;B@zbIZ(@LjLBx$kw=yE8;c Ӣ- V(:LMq<0@5O#2!̑FBbs Av9;bvt0~`2$,K@"H0+bp'2t0Y}s߼1I!* ʊψ+4Ce//=94Hbjm?R;xU ---uIecHodz[; Oy: HqW$ =!iF%|yj`YYC'{OL8_a>]C[C0V!p5KJ^=TZ LyF,ThqsRqH#>%]@vUW@6Yz QGӗPqPQ:|L9v1UN Hs{Hŵ!ZfJkS IgӀ;q/Qw}D!& Rutn%9,`IP"$R9wsO7EHVƧ\p{<FPj깣O[/CY֐,T! uC; Qx"FG@}h;ћ2@[zFH4l@z1u]r\RaY4$ȇH{2ZUG^^82P#D(7(D,N5m@JZSu^@NWPgDF?n E+B2X@ 5E1o ON Aժ~583  Hv+KH7pw"@O}H5$7xetQh|T!d/6:If`ר~[x>"@z# HǝRv#G^zڵK*[uɻVZZoȂGЩ?w,e> &()A-f-Mr);rψ$?@J1q`KOfhef E(}ē2Ha}(3[cHc4" a31Ic$CIcHc4hv?s*Oܒ.H?ݽ%v~zÇ"O8rxbw^ߥ h/t(SW@O<*lHyvޝky?wx_1X/7\CR߇5hGUvx0SUH0dہر mhph!GH$-qDmq {Unw!迄QUC\BJIN9yF,'<9y秢%wL"+=2tuE%?vT&npIׅO;}kKHG\34L~uZ0e?J2~Y"o_ijR)ӗFG}^# 1o®kQf"$x*;}_ժ 3C U=qr8!m "mJ{9x^t֣"f(9`)XD#%ҟ!H)g}B k9 " r)h "#@¶d)AIj%$ߪE=}Q,o|e4eW5oU?3 ɿ;Ee ey~_O]&>I\$֚CW;T?C;ou:QqhAշD-)|_P…4m!4Ecv_DL;w"s}o[Piֳ٩A" ^<27` #ytutY;J P 1`zD(Q;8B" R%GH"\ M(} 9Jy$%$Ft$+8Q:sGRjI9yu}3Hh?jKڽW{q?Qץa!)SYCJM @Bǫ5Ρw0|y}D,ZxfHgnMf$8Uj\ī/B *N)Z{Rv;-]}`Rv^ik2f^ d_\~6[;&;O`k;)8#'HN7"׎Gٯ:u$/MuX?e4Or#z4rWgt] fil(]аʴTqULDGA$"%/["RHHXe2)4L`/\sd4NA:#s'57iR;e<|fU?̝.4edu%ŝaddBǡ):VGSBOhϗhy<E,<;YxHҁLW~?/#.kl,زegks~Ry4_kdD&GЌ)Hq|4 ^`-h#h=*F݉K00ަR7HO|HT{N$_ԩy__mq;&bwUUPe*U*,U hg(.~sHj}=Wėӣ$1+=l6KQR フѲe zb& 81Ghٲ LL}HT̀OSSfnž"OCuV:'J);/IT^' G EG:ی @⤝+6$H6t$ª ze.,i ewgӃޭp@sf*I%t8s_H 3|z0Z/h" H$v%)i$ $0 HyL@#Dlc ǬQ$cII!\1S8LXڛ+ .3^UV}_$h[ƃ%{yVwܞi]u yA U/˖- "z%"ZX͡>=d|eo<=d JerJ@ec}zv|huBMd )-U-?otM8>\; \:[oZaɤy4\B#Udf0KF$|3h>=lJFokaC+|jgb@Ӆ@v門m&Ӂ# )A;GۀRHp@ӳ$CXdL a3V@d U U',@2%.!U2wYfRa3 &:||,1 :yd2)hu:yd2˩3yrwH2՗!'ѐ,mƙ; PXvyK _YknI`@}oVeἸEzEFcccg28Iw @#F@nA~@. <.Att5(#(  J/[# &sROs'tbƏBR,D9pדe aH6S\e aH6S\e &8d<-ZOXL@9̲d >Brmd HZ/YOH@ v2~ HzBRNPd Y!hd4-l }o $ B4N9D:ZCƻ*rGĤ$rT4P|D㚕He$ ڣ7҇3Ef3(iVQAЙ3gjC7^ N>[P]J@<:`tݛ[@y8Db *x=urIepFx{TvM@R?ZG!(* qu鄽%' FWH.ԈGb 9Tܤ6qQ!wv@|a 9թy)E $$④O#o}}{H\wrچO F,T\㥰bѣN5Y||]SxES%>r*5$M},d֏קe oO䬛R849D@&AqE :sw.#{H/ kH5 DfA&x_,rs<2âbGDb$;v MV@+:s`WmX>6 $:FLAC]QB;$_YF7Oh=e N@H}CRķ e:"}l#;9JjB7Gm GIHL~@a21 @dbn >N2g'H &,>#&H}#Cmv`2um>8Gv`M'gn/𳨴2#8#֗UH W7~m ǎ[GG; ؎72D+;G}EpNJ8F*tsw׮bmb;+db%.;%.J-s\đu) Dg#dG28f`I@☁xd9qd}]'v-On琁-Ng*#xP Uv\` UveZ}ۘGlԡSC& I! H5H;>&Ihmo1uB7U:VjF®d 2$j@dH2 .\R9@bѹre!@R` ^)H)r$!@HKN azv42#dI@$H'&G2), $55C^ vEu*zxuIn߻ 7 OlԫHHo#`6Dxko0k'gBYCxBG{n>a-eW8uB:4b-DN}PԀ:tꌎ1;); "$>(I`R5'gΧxpN"XQe2RF;64K#䳇CB w{hdžh +_HbC  !z )wG Z^UdU:_l٩UiWF5|ϟW%: -{s^x9!Fig.T}YùOcf}4k{Wn5xW@Z#NBhqPBWpqx1Ƌ{)_)@D$aA0g"q|$4V,R9(t堰kLc>f/!')>ә@"ߕ@;#7焿: H|.trs~m!m\ 49-!;arv 1(^/K„'0^ 3ȗHMe$eR#2)zO?c.]†E6H\sav̙~v`F}a~nl6L=[phE9_ﮬƱ!7FF}}Eޛ;{JN9ʾِc6[@!}EsHI;8DRҢ--ﰵK{Ϲ-"rl5Tw[XZHe RݏGEQ; s6ǏGD$ab$ X OD $@s\}尰}G/,퓁Tdz,t(.u'&e`lE&ck]"5QLьg,)Y,y,E`Y$QBˋ͝3";s~{tِk2ʹb"=z=<_ +@<qRv /]z@1e͵M3GK>2ɽ /z;w)&0Z ɡ¢1HI AY o0A'.kO󆙧MF“pβ2԰ܹo< u=}Fq,_^/8Ck_HDBɶή/[&쪫sڄ]|׵ 狝&s5 3g40IJ>@ⓔ^ NGSHDa Ka)L@}z "yH) k} 6&cX%ƥ=_N$ʫsdU} %ŭ|^%djJt:oyiuOwH==mˀK.߿ts2nz[d 0|Ţ.y ,xr%mۙj"݁oIŖWTMu{ì‡_ᣁVP8?(ˡRDçl۶HD[9^tvKK{@i@]& -(KED !ZƯXCf,폕<"uL+u5:Uuu< S㊎Gt9 ꃮkxd>GhA7S$%RH]~!͌|&'p9242E 9rT$aMCA>|C(:v$|>#584D ؐχas(K:GZ*}Ծ-~JejÂK  \x#,44ӧuISN<&ɀWR~meFf뼜`Z}4'6J n[^Ow9j_J~}:k|=n @j77rv}\IE5G/Q(C$4XMP 0ڔ}af]6rHV0(|| G_@%H(u` *9R, Bz H2$ qUxSܷ73\ұW5@r-,"[tRuItH&cծ;&񙳷 geOhϜ&}G!n;؁V!9\>F>fUNCjUoʍ́t&Bz$o„}VUVEHLi $Jn,ao7ww)!hōޞCR#1ٕ_K߻<:#Ro72zQ`I|G|rDed_` 3{MnhyD>/#9Gՙ+fiϗLsdE4> ƭ#+bj}ђT, Fe2:rhfϙ3ETD񒗷i -[ܻwoٲeWo]}ٶ3h9!3cH"k5 5g00փhT:U92B&<*}#R'>FAΦljrMyG۱v„ 1j^Iq P{͑+cTZ*T3d$W;'|"v$2lGVˌ!B, Um~ê- ɕ )mˬ$W.\^u6?IS &y_ WGYJwyTpW-1> )m𾄯ѕ| T| V"s\l\sM Ohbph_/1 UM78LFx)~V+?F8R7^Sx׌& D]hS6s5o/5oڃ}ģFFq(e uHzI#U FC$]?J͘oɛm$ML _1YqOb.T8^ q-w>o Y -M@S|Fv;T]6،0.w]3|=H_:3"վy:Ɨ0P㋥<# l5揿5z m9 ȊFgy.[jiFmվ  LjjWb0!4%EIH'H:4JP_nf)7u.@ZQL![c"Ujhm5.vXqVR>pф~HcGMD$&ɜZB-;??.[-ws*JIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/slider_handles.png0000644000175600017570000000254112672631600027630 0ustar pravipraviPNG  IHDR._(IDATx{Ley`Cɶb /+"VJ[` Mb%R)pt2l\,aK!G.6/=}08gϞy}Vr ؂8bVD!De^w|my | C%%l?Yu;`;~Pr $Mu!#u}},sPdF1eAY"yֲLQvk%nmrGhS0hjJ,jfQmNSt!s?DX3܊Jv9@Γٚ|8qԍ+<=`[;?DڛOlc9yzvslVO-t1/k좝%Uu6j̮1PqbW ˪i iQo6z[0;ɋ. 7/zQ%*dhZ6٫EDz_+:fܷ=bKJ}cՑkՂG.s1,y2W [\V4͒ q\-գ[}:nnZD7gG \׹PޘkX|XW ##{*v":xwߺZcSՂ-qeᥑ"V–v2*źHE繴@+bZEyEQearIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/swipemode_sprites.gif0000644000175600017570000000077112672631600030401 0ustar pravipraviGIF89a&ۊmmmwwwǞnnniiiכӰfff! XMP DataXMP?xp!&,@424 h$fGf$VXlAJ`0;d?IUv!Z`UX"U " U%"%UXXU` `UYUaU# dB#%BYUB$a$̻C$!&׼%XU`MXM%Mhj©'P%D5D"EAD:vi?%51 5M؀q+jL"G$&A;gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/touch-icon-iphone.png0000644000175600017570000000531612672631600030203 0ustar pravipraviPNG  IHDRDD8gAMA a cHRMz&u0`:pQ<bKGD05>9)tIME 3~: IDATxُWު}ͳ2^bgO' G@$DHDDqpsi0ۋZy ̀".&.DrLl㰄eb{BF J5eG!#@o5#3gm $eEZ*DG%µzX['x:M $.5?bHʂ?N7|0 GksK;mi ˊxZkܴQLRx)(. Lݎ 7bP!ݱD7\( F_Z.%G_U iW@ݠmٸdS&:<ݭ޻iBcmv] r>[;\E匐A@-5"dP1JdS[]g@gg Ps rvpdX,\LpkEkL !R`AM60@eɸ,y,GO渱}"P/Ͽu/& ,S`>]em%\6\/c"GH-'.ڝ2NTPUDaB6CDGz,0Ui~J܌$@gWJ~jwhLM]W{m%Xw`l89cgÖGm>[/~P1 Q;zQy^o/9!LuW"6%f&pm(&]{,$_8=1/3mB~r4#WP7 IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/0000755000175600017570000000000012672631600026657 5ustar pravipravi././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/twitter_64.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/twitter_64.0000644000175600017570000001134312672631600030675 0ustar pravipraviPNG  IHDR@@iqiTXtXML:com.adobe.xmp {iCCPsRGB IEC61966-2.1(uKCA? -,R$QD;ăB&yK<ދXZZXx`ck@V,lDI A,ogfwghYay3<3.-{/4J#t4˘Դ|SjkA]fyYfP| ұה ?)=^7ũ";TN O =*W6=̆VzI[r}qAһ3$fʘ#/+jArh)!ٓ2'eCLZtB<4g8g׶OmRJ|nFE߫h='ځ?=z6bf(Kw:|CtAJn} ن-AVg7 pHYs.#.#x?vAIDATx{lgy?~b8qlM]mbj1[GRhɐemb*460&X6$NX:+.40i]RNvMSǗs]g'qKR|%X;<.2.2./ŲJj+%{o.S~W&DzQ]H_0U#ão_@7ߟ_U1у?m}^[Fvnng:P5{F`C pމяr{SEY%16fAܬYqۇJS_9uMӡsxX}I;7unݾ|: ︶lxə6? :W,$a)DKNQ 0ҬNЉk?o>ۮS Nc8|}spt zgD̿N 6H$K|C_sw:SCVbH%Qm&lso5_ccDo3VW?@0 5C$ھ'G&$).AfNe;5F-D$p}A1}^VJK ;G?w~$8D=5_4% cPu:a#6[m `28DQ/1ɷlpd:#;KB_JuGжh<~*s& "(WR1.c3Wd ]Dv$7wz.>KcF0/ En_*m; |_QMTrDZI]å5_ $ 1";)CD,kVO86>2Xп J3Յ"s2$q\;au!b.qL.MT7~X.[UH Iy]H}oJA1Qm&2͙[F}.kcnmApY`*pzɚt8?ߑ곳bRsWJ062OY?pH˒̇$iNFa;F&vX%y+rLvMJx28jL|pΩ[>ᄇYիO#v{3yp;nnfpțVGU, Q}6l78j=82Zw]CX.[(~לm+ ;=Isd~d+в{dEeو9ONcs.oG6=+>*<'O|g9p34z/7|bl&YOY1n?HMɒ4DHhwkrYh_UMHǢ  b\ەbl{ / &t|&1|fl1Ө> F]qk袤//d ^]ތ'Ao|&"_wqB+._1O 81$QE~ io GWjįDكNA+SgHƌH8i ݱ"Gx bEZX/ɉʂ<^`WiPl g ]_=!CT ;ݘ$ F-k3~>9gwn^?ߑ!-Z.hϢ"1\JYmݾNw?ٳ9YT}.l-"cjs{@?Uy}mݧ~'}8q7"\}^6Oܨ̘WV;. h`iC& 9 +55zˆ(F/ P_.B\/V1k\Ja>E%ؿ"[,tuT}auXkW P4fE>=|Jx^ 3.rw∸YG]2nK2IrLX>dyMG=}؞L{'i3홨^FeK(BOsl5hTWAd^Wĺt5D\7j NÛ|X.NjEY,mw@c#ς%"F-F^͏DЁ]{*3>/Ҷw|r?]~;nQ"3/uN/VsޯK@?czl՘*S|pε'7 C5':uU :Lsύ1;=c(RY/bl35Fc^>ExKGԁfQ'ҚCsʥi[mz評{!lx[^SUι5Q QmU] e\LMJa藺W$yNUԝ W"\i<kf$l:D*v,}3m${wm6cX=m͖or1fsu7.jҜ" $tǁkwM,ԉXo+ժO"|γWJ7Q{tbi J^6kOqq*BvLυk@,Ry<^6OTnb<D1D埣Ccxت1x-Z]}ǶnW9qF*b~Wv$mIENDB`././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/github_64.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/github_64.p0000644000175600017570000000510112672631600030630 0ustar pravipraviPNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp XIDATx[ilTU3.A\ TkkQmP*CL5QD@QD IEI-`P+k43üw޼ 'rgsw}{^$XrrQ\\cL Cuςzֶ/(n΍Se !=$x @D/tQ^`I yHP,N3C#] ⿤/G(2=lPP8/ɿr+"z='ΟuNoy =#ΏB1pI  M8PjRK8`GByMj!KMLxԖwV)V232?Յήo\}Nv_i6ʯx] LnKjOm6m3 (nKOHF.(,j{:choVo{Tߡ̦@  1^y#OÞAQVA#ZrY %tΖG;&P UZ>Ey0h%sMU')\-qQkCoV#`C)*unƻ-"}a,ëqfzM\2O|$@B[S9>" [yD ,eW-0 U*Ghm(W*kXHu*ܨl$f~^lT69{HNNi?FjoYqPY7eЦͦ~cs#mH  >zx hRtdo {u ʰ58{ hp<Ь2菒RM*LT6nE)@@n7W@s@c!X 09+HY-W*'Nn1(7L6iSYi.:Jw$IE:&yA8vU>U.{# _N[\49 J.PFQXMyRElSdI.< |IPr8m)J`K5ξ̌ fYJ!}$bLz];^q[~4ώLi`AoҸٙϟFM,p'[K|'H<4\w h3.&uz{0* XMG|>̏.;Lb,(;Y2"x<. ]9OXa`:߂zm@ >l:]?Z Ǡ?x83zS LA Әm:[=tZ|$L3@df棅ov:Ű+N/pDt^"xFk$X$8uɰjK,H=!q*$P + [P,M0,,ibYwǒey[!cjbs;$2 +DgТ3 Wct4H6_=Q/}xӦRj?O~ m* 9I)0K9.aZ-n}Qʐu D'[}zcˈX~΍B, 'kNf9 _T{"U>MIENDB`././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/bitbucket_64.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/bitbucket_60000644000175600017570000000416312672631600031007 0ustar pravipraviPNG  IHDR@@iq:IDATxݛiE{fUee5'ƃ+A@5Q@Y#xGxƋJ<PHDXVP+v{|cVLO"?fvꫧux7i`2ƃ%` f l;"1Hly 2p0|VP Ø55Iݯ? no$3a|2xB‰T ^FJwI梅.5ЋH/B@Z-0k$ux di+!iv64C@A{Ȉ4 1 5 72 1 72 64 64 1 xmp.did:05801174072068118083CC1380C2A5EB xmp.iid:B8A4C634A61611E28BEABCE338DCB390 xmp.did:B8A4C635A61611E28BEABCE338DCB390 xmp.iid:AC7ABFA9382068118C1498AF981ABACE xmp.did:05801174072068118083CC1380C2A5EB 2015:10:29 22:10:97 Pixelmator 3.2.1 ~oIDATx[[kAv76i(>TZ}WOADAA|AP^&&zNjD$3͙oϦ ]z3tBl ҄E2O>Sz_١* dyܭ|DL%}V.Nyi<eUaiRߌ0`>4ME("@VUT( ͕r tNMO̅ 03B4DބڰnU#)]]5L3=a`2Xc:.^}q<|A[K-njޝhY}d=#ZM X\-wk|ס-w&9؍ּE_ʸ?:H$ l]zVs r5+qxO#=+8]kz!G}I׷Мm5X$a:1ܐ+`PWu8aBv.ʭ+$ŠOa^(ˁ+6">"x7wi Ƒ$"eW@Ua ko`$;.\Aw\4nyYѕ! =?bI⩒]B<\ᣔVVx.^=ՑvDO$ӹ69')2E 0 M HUm>p9+U8}lKTCRe^2:`pxR}µ(M ՜{9XZ&Sy5a!G?C 8 ]$)Sj 8B@ɐITh aJ.3),hd,8*8@IB.„V'[*V"_iuH3kEls.ڮ+JіنSG%8w"Յ-s!č(7D*-dח}nbsr&.+7]U. l 3⵴^q;^x-{F܎;#^K=ΈҾxmx} FUJڲ ^޾<3A,Jլ pvOy]5ŭRuzq=Go J iCCPDisplayHw\S$PzWz l$PBEׂ+b[]Y+X7袢*o|oΜ9GcBI)LdGGG-nDvf'~syh|NNpG$. v"D - 8M~r8(l8Z*3 90+B>هgs!CɅ286e\(eg?W*D ??%'[22L_#[[reL|PY1W/$4~_g oppMP$+by_ 9A3fGF(s.Ŏ ,Dkq hS !2 rk~Vlp߫E|V䈏X#l Y88FQ3nj9lX0g0~\/)Œxa=_T3_$ʖ^ٍ!WƎ=WN1wf&{bB3\T7,@k@)ZaNAaHDy^cA fHy+BQj孅Y \xw=F1UGF%`ըT fg'"÷x'.# p$?QfPF ];⃛C.x C8v3? +j?'S|4k˰'1 5{20ֆ.`ǰFNbMX;v\ƣ<FFk˂q#>ktyެK 2L( r2\}7 wa\f;G)4f|M8o6Z ND\> Tᛡ sr 0D8 Uz& PV`3vZ8 ΁K`n*BGtC Aw B"$IE2!"A"2ٌD_i҅A^5 P xG8tEt%B iz/ `*30wEa)X:&cXVǚ᳾I>#N8<7xފ_û~+J#< a$Ba&PAM8B8 ߝ;" Z໙L$! n% "vH$ɆM"I&^IUR郒RRPiRJW* *)){*G)sg+RVnVܣfckijоIFQ.k;Yw6ݳ}c5z-{h]=TZ/Fo.v}}&3} ?Lu' z >u' 3lFf+H(HbӨh8x&dwtu&-&L֛5S6s7m0k3{onahԼEEE}Keeu+UVNkŚo]i}ql%z mloQ 1E[4qSƯ6}}= ^;Z;r+;Q859rq9osBwԥ勫uk[[+{<<xYyo/;,=^&XLM؛[I#5eV>3{oe}8H{'kT X9aqpFp}pKȜS58aua&ΛN (:B< 4qI#"Q *,jmԃh''GO$!fnL[,=vFwqq[K[T&%O L,O&Ot)Y7YܔBJIHٝ20%h)=S]L9bڬiNϞ~| é=Q*@ZXږ~]yyOӽӟexg+}`UfhYQY5YCىrrRs 5Y\Y]"QH癷>_.ޝOo*Єv'IwOaeᇙ 3R%>zO~ik4wyvGoY``ɂڅY //_TK/ySO%qɭ^K/× u,wZiRn2+8+.ƟVXjjjk|Ԗ?^;im:uoX¹bƈML7y3ʀ[,~+wm~o^;Cv6TWU"*:_v.FX#msۣgU=Z/;uo}M<8Pv|k7j9~xofm9B?Rڀ4no7JN<|q3:Vy\KN ,:9pJtt-3ZI:surk;vc%~z:83/V_?34$b+x J{x#1yAgH9cřM^\ Gd ˶q~ur%?QO.CCo 5E<44uhK5{Sys|sd)s&lZp pHYs  IDATxZ{lEfvv\hR EZ#hBRHcH;FjMHUC TC"kUzw{-ݹ5ʗ4M6曙#(>Un_u-T,/d>jj #;)ci3ʲ㟬hiYӕ y Ӳ+dqo8M hxK&[B :M)PA. YNq iNNp{Tw9fSNH# u{&jw,l 0> (@#PwSѧ+%+bԵ3l!-dBUb=*NepF_5/_6 :/|`rָqT!_5Q~~~) >^J8xE.ԣl]O[W*poz~uT=Aė9A@$!a;MNjeh Ss >k \r7Z[#.ZHe `Bfli$_ C #{5"quէb#,.NacƯp] S:EVriҳ\ *1cdEI$mA.0h`% Q3O*mDX\V3%C3rhtJGЫ7N48[m ΖuGV@9mU^p jٿ_`4 $lXY!u w;A E2V*3>$KG'܎hpNl,9$&Ewhy2G@Mz'&kQ:vn{#'%NF ]}&:zZL4ghm6&vJሮ[bNNp04 `2GY8P4Zm?4i?@m_8M&0BdA**ʹNKP͕omP}'0[tg(z䫵Jł3 wRQQ.= 7(cBC!IENDB`././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/azure_64.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/auth_buttons/azure_64.pn0000644000175600017570000000173212672631600030660 0ustar pravipraviPNG  IHDR@@iqbKGD pHYs  ~tIME  +PȩgIDATxNQ)PKDEBwL|}\d64tA\l\d̅U;S{ 9=Y6;s~7m@6T&P^r4¨ &9K5os_@F98)2ǁ1mVy`v7x%9U4jMGsȝl^*{rh]sӂB~,8f*te`C:\'7C`O`uMU7jo9)/mԔÏM dgnzL^IN,ɡUxfu;c5'7_*4' @Y(=QO888(/ouz f錃+1Ԯ#+ kIvI9©lā9o8;-\-8V#W?5ߣ}&` l\c3 PUr@.y͢F(tC1sa$Q^]*2]A^8Y 0Fs om<0f8yXF,X"E8I,>;e;̴BU 3MD¬J[fpMln*u|Cѵ :㰭/'ɣƶ}2(qtN[щO ҋe qW @6k@f:=&wVzH/Գ,Sb!n ̣6@qF`G &r +cGȷFL~W:PJHV~,Jaՙ(e%¥ހ@&OO@a->]XH+$'l.jEGibOM]ee X$gnGLj bVai^s) aJ1SȟTOc0ೆtOMABS370)T;QKx1pXQAX$j oߢ(v%|ocYY47H/eMR_0?#S$`m QNm _I<5TէbX٘ QGnua;b'HGT VYK$nHp:rQJ6MŹu qlM"[(ICdzX3 L4R,òG=A!u4J |  3c[Qxʝh&WĜ[Iir-*Jl+?HLnDuP<:;ompqF \ ɉTn>wԒl{)3*Gk;Ixx M3>F%C A R\/>KM)00|(!yj]`ob(ڤNNnN_-o:u^9?.«J02F3Jh9@_3|z" M}HR̮啵8 zssOM@82u4p/RM3Vc魪,}no6@*\̚+}IsDŽmKG|/!cU)Qޟ^ɷM|B 7PvigRolU7/m [NIN/H$JG oà_Nheұ-Taxz^ޥ[X4E޸r4nņXL\ bVκ< TL02\0[(/?.뫯׃: QV^Ko*bV4_^(]B'a U} 2/gU WIvnF; ~U}86`ޯ O_@Lp[AR+k%fn xB5%}zKy\ _<򿤽FnKzKY,9ߏ]3ҍ !X`-Je^r{+X[]ceWqJ㸳Vzb 6pï-U]0X_m;ay+1aV5Ȩ+0q˷T2z_n&;K/y>r4F^tE`(!- QN"g!Ax^8N%tEXtdate:create2015-07-16T13:40:13-04:00%tEXtdate:modify2015-07-16T13:40:13-04:00,IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/no_group_avatar.png0000644000175600017570000000165612672631600030044 0ustar pravipraviPNG  IHDR3BuIDATxq&VD$"̥I6zgʹ&(_%}VB^ y!/䅼kaHT2v|HE&Avi!5:|=|+yX炴L'd ȵ!ITAA+ CHqv}rb|C"(ekHl -!IJ$Z Wl \4‡A;ä )NHٙ:wq!m;jgWޡ,p!\lCUfB턬8!B˜U$(J.خ,!a@5€;D"4!A'4M^&U 9SC$B֧]N4G}Ѭ m 9Cv!A[C:RHݡ8rCv@i DlloBM Q>3_>L =!T熜&"4C"4ECD 77$AQCtņ :hZ_+.$om sCns*b|` w9Yf:d盙 ou :ׁ?ڳclXBb @@@b4x@@@@@@@@@@@@T ?k{YIENDB`././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/monokai-scheme-preview.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/monokai-scheme-preview.p0000644000175600017570000000717712672631600030713 0ustar pravipraviPNG  IHDRdԬFIDATxKٻb49d"$F۱(d6KU--j!)[h 5Y. "c YɼJbɾ'3LZG-  )` BS#`d}?]z]uϳ𛟥L<|oTRKE7p8_0`o[xL#SrZTfHcyxة /×-; 5uGa }܂3z$Pk0`{;+^g_7V`55e3n(wȘ)1_M ,\yw>y]G#7W+hѽaq?_-P7x`X0YkľEuvc^qVb ^ek eELa׸mj>8\16!ăF5 bBA =L=0Spq_L|JUB av>r=MGPiB֟j]τ:֌dƺ"c!eg/c;i^@n@a(}ZP hgpF:Ff=P X4 /xU& }$# 3^Yga@$=DC,s[I>puvEN ̣em?`aY*6c: >݂.ή[r_#6nZ3v:TtM}j>V\`݂.j0Ʉ060;'ԃgKE? 2r& fܦp}mdtCeW/HWuC)i LB_PT(`*}<&dr|NJݜ5L)LOoƅǽFGI=8'%!aY#qI߃lyVw۫Xډ6`Hj{v^-*LEZrҹJ˅g+q!#)ˣ/\>11[v[|>)rgaqER>8P=CP Y1HJj2+=biI-^H"'j0!+0U,oW,:/mjXՎjPѵ Ue_˹:m*!% |cވ|~6YaШOx? `uJW5 8&"ȘhLV#m`i&d+1-džN)9L|x)fOzrj~x\5/xUNtY>y$8LJ桘|O fSs+5Ǎ6.$)jv]kyZ ڼfT1Ʌ7-'J&13 #%m-O~Ҫyo>!'qI(c^4(+c%6d#wAѤ1 .` &#*bPENmʆjv7g.لm0Yfc~Ŀ(޹s\ Dr FV^c/. kPkjIB fgIDNd$!=0 )GE-qEN`% \c&15`_&^G$ '˒2Šk>8>z| {Nڅ$$\= v:pJ6aWѵ`, I|Lwg8+bl'&(r>uDs史⢗p$&?6kEr1R{x={':'(~mwo%8afЙ^ h<^GZ(`*p LBSm4SZd.'GzX QRV`ĒoJ%7"$\?kz[qt1ޥU'1Z `ȋjpgXw+0h^m:Nb,`&׿X+0JnuwS_ b$; V`];)ʣEI\)`OI dQ0LST(`*0 Lb2;(7"KQ|~hP0ȏsao `5JTN$<` 0r&W &:Pu-0 LBS9rV$`7y^Z;gSh(c)|gW\|tmlyIC.2CpO0iϟ3RfV"p~g2{xSh qv=Tc[V|L!nmq(4e`0;,.[nwEQ{p2hp2d89 Vlu]MJDWٺ8?b#1%0*#8?h{z`D\̳U;1HdwK>]pM1$KM4 24uO+.c ._U` hRS0u*`I|pK%|,DUQf>e1?+q͟lZP 藪~q E6lXʺȨ܁S:MtPPT(`*gK;IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/icon-link.png0000644000175600017570000000215012672631600026527 0ustar pravipraviPNG  IHDR@@`UgAMA abKGD̿tIME';4IDATh޽MHAGzH4db!H(0[u5 Q":t *Clx.}v %<f e!;3;3eyg_A8 aCUh'1J!rvp^ l GGcOy9aUFe**xY{5~5 D8gdA!'Bq+A@J|Ƙ^Pyf!`+a&qL5&?+jN->ۆmcȈ3=7i3JI?' `s0?(n1l]O/Ē1)v <ӽ&{5KѓQa! *|Tx.\W+\1 ʍ3(N69|,QDOŀ椤%> \7;^)_S0gxJllUj}7$`i.x+~+^O ߔ=p!Ie#oNǏgCx~ǎ ƻ( L:mlnC Hܰ Y*5Q)|2 ϱ0/UpRXlfV~` 0C'uZN'G^$tq6\a$7x^*,IR{;4k9$ 8Tht]Pl%Sp ېXVS|20B!TArGys.rZU*Tʣ7{|ZQV,/5QW62\Ji^5 &ɩ1vF2vqsdxi,B8M9/~(a%tEXtdate:create2015-12-01T18:10:45-05:00<ۀ%tEXtdate:modify2015-07-05T15:39:59-04:00^fIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/logo_wordmark.svg0000644000175600017570000001177612672631600027543 0ustar pravipravi Fill 1 + Group 24 Created with Sketch. ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/touch-icon-iphone-retina.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/touch-icon-iphone-retina0000644000175600017570000001160512672631600030676 0ustar pravipraviPNG  IHDR>agAMA a cHRMz&u0`:pQ<bKGD05>9)tIME 3~:IDATxo\}?s΋7EQ$E-)ز,Ȣ@Q(.?]hiStͲEim%.*vD"[~đHPCrf{8B$>{~3b5Z~C/ 08$CC 9 08$C &YW6prSȗw0"<䫪kE{F̜-rUhko;mH`QTox3ӥ8.<7k5UgTdJ\7k;&YUgZ7S6ʝ}L4L_j(˝2%]1L)VT{M,gRKʦ$v(;Iڣ+&3rew @f8e8uxy鲔o$Kt9̌˪%ڗfY#^QgX)QGdtL0"<.m|0}+\f&8a8vQ0b.DV4+=Ng8gBe&BsYf_1@]Ds%J{٨Sb7`Y  ]4l2p`I:,4KF=8*]N6 R'eUrUBxU`- U˪/D(4+ѰR%BrlEYq&"3GIM9j "|7jb%5tӳ7`WTA43 J5,@n-x6˔ pmG=Дʚ́%e6fW>!(/joxN|h:05N2 VQ-S5% LeҸEOI`5FitM`T˅ps(| F̢FQIgk@Xx9qfD.݀|Y#zDR 857&rd1X S'' B1Do̝Ҿ S7 s`MipF8mfqa|7HuJod~a{r<'b\?b-R] Pi_K4" @$k? V̿]Wٌ89pj2hPc sNwn@1p̉w87}B+FPG4dAa4Z*jL3ٷ'h8KW.(q!Hc6 {52 |vh8KgmgH}S+s/ B 9v=aqbpZdk=aquFj3!v E" V?܀0g=(IS@ˆ 3Ҩ> *+{(E9:ޢ!4χPB NX ܀oI:;U-TJY:6G?1ҐÍ1?I]$j  b[pgbOJ>=p("$@hBԘ4|_7ŞtF_[kූjȔW3Be?EL̿(bOX|x,MdS˾]I^!_7 TL-EB;M'3/-C]BkJ"7EvJcz[\z7?6Bfb{v9w6x@HJTL7\OZ_L2' n}7 ?YgWԶ-$5*{J1o=s:ث^5-ܾo+| ;H!4ijT܀#f_S\醏)};1{o}jQk] ligO iขȼ_ ȏkpxfM0p !& eaȴLh 53U.ʛ#|9U["R~tȦݛJמgT3Ԭ/C pl0h7ŞJO?JJ}U38;mS :!L!v߶)l5'W6sJ1he7&xyBDRB8"rMy4&`F}wnTqʹ} f*f "Qt+($4syP94sdGip"4.!9 0Z3{B^}68lTT;C᳁]bOH}hET@FP ZtPBqJdu%F{GA_kHDWHHAu=|u=Anbo*U ]3:gn}gZV3 kɞI m۷;fU[σ{DN @-JoCTh=6j Qk Њ0AHZMT +&bO?Q00p5"Q˯׃ZA-8 =GA߻ *^zaf sit%(l=T}4*{ڴqkneZM3hV9՝DҀږm4fdVZ*uJ|?+5՛p}-"$R'{qSX׻c+oqo3턁&t FYP6n`Oz+?٠Q0.`7jζf J")akKmk0ʚJkO Qp0h܀A,՟~I%X{2?hJJŞo> hߛ4ԤCNᗗ7+v&zK<7QGmw^ÇC5_?m Jf_(:`8ia(FMO!qH!!r`qH!! S5_%tEXtdate:create2015-07-06T23:23:14-04:00~%tEXtdate:modify2015-06-19T10:20:51-04:00cIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/gitlab_logo.png0000644000175600017570000001210512672631600027127 0ustar pravipraviPNG  IHDR>agAMA a cHRMz&u0`:pQ<bKGDtIME )IIDATxs]]?jdINtB R  "dC' 6l/TiV I`E( Ƕ<ϖlI<;X'ɶpǧ[兟;s=vsm bsK]p`c;%.v8+dUw>A޻Omv[¼,w/1- 'ҿ3x#Ch|kEW%_a7c¹]5KR>kٗ>/B >lϼ'øw mV72+q\+B `C\)c_9_h"k _0A1 #@07#΍{C]@+b_Po/& 0x?!5j}zcwoVwaGߤ}uWV\D0Wog \../xǖFc"B/='^=~XH")[_Jk%b}a_pn5Q6Pr'@ qq{U?yxnGFq܉wx&AX׆ č[<ֵ:čI+•%I]q2 'Iuݹ!l}+#{w~Ìa;Ÿx{fx12ȕK 3؎po]!x,;y I12 sR({8 VZ3ܻS}9oݰCf5sܾ|"wB4ȅbd&{_@쁳prGɅͤV=vZDU>^(qs4޽y_:1Q!ɀm_0~Q2\ǽw`b,Z)[Wr){o4 Ad@D*[Ε(TIg7{:Գ\l3/rYy޾J<ҤVh^B4a2R@_g k*~3f8aL.^9NJM.fzMs#ۛZ ( ܹ6C4ûMv87ϣ#@}\&?$dBmɥ (?/~Vff"&pJ=Ŧj6C4=b3S; P14Vymh&"f%{A =p2Fpn^.d3DmizǴ6sbo?mJQ܇L4m/M+x1s;uks+6 +ͩ, #L8Eٍ`pK*./I^6½s*7}*aܡwTCFC|q\Oe.8 8W/..6ʗͣ>(Rf'װhzz2 /XKͫ7 $ zvp~ `?)t6{ #6gK̊CXcW35X_ϡz` yD1Y)Y M7Jma 񟢎NP_xcgN 8@/`u? cUM825x( wG%aZsfQ {:̊=T/&΃_hf~n@KꃀRBӚtIzX_oa͈xphe@VgH^ 8ސP~F@#6 `ٜJ$F[ʀѦa6+ o2x1&.W'-{̦4z]+ f 8*կ dtz}xKDN5eO55t8AWK`ןGۓ2k Y.рHd4L+,4uװ.YFfϣ'Epc$>aPt|ZTPјk_L/7W #h T&aulcDc.`1y12jf/2{/MX"F{@o0GƫfOL2WPڽ8y d7jעJAдE4@Tz_"ON2ɫ%N QC^ITZ@ ~Tad6ˡODF&C4̶_'&l=8!}Z314-Ե2 PԊ B4:V o)`#[d"CLcd VM*([jy6ޓGtN[٪Zd*Qj+gą=@f6fu 0~|} `&њ l+(`H`ą3< o|}$ 0nUd׮c_==qA?yD[͗T@OiC*6Vk!$Rg'*1Z7i̞6|Y7iI)y{]IƦl?SNNŕRd@/is &iè>7Vq7\M"])u5I̎Fk+{fO=ɿFԆ0YQ?| uō L?b5A4-Oˌ5 ϡ}[#^sT݃~?FDP MxCCň"]t #8M}/>0k{Il"25\hI<3ifJcvDy+n@[AaI2_HA_ a1*(OIx}dDBc^E'A#iEQ'=W5ᴀs[SWpObE(6aP`OM?0VN12:' 8#?Ch{ud@f\&' 9uJ0̊  ^#>ghpڀu_i7~9 MT?!|>A 9,\ʂ"d@}ĠkU p'|B}2|zH 2߄ HkV ʀfjT%7d-=> ԱH`2#s87`H\P.Ǡh/D[H>f&ozdna>g}3P !$,[̏)]N2K:aO2>_Bk'jY'(3&QɟgP1ƒu13f̥O)_*RA?'g-:nqC<D  *2Cɞ_s3=)s$(}3Pcd&LCeKBQj0#*%*e̖')ʒ3Ha :3cFf(uTLiޔCn!d T$i)Ҝ˜O:h3+L8rb4ڻs$RhV(]ȍo##3JMJ)<hK\҇Egڸ)?̕3H` :O t2`vWj<#n$]{}s R FJ8c8n }1IЕ'(*OM$@) o }r̻i)pÂɲkPX )%'jRzWVi3]H&fA :vw }*ٻxApe%Q&=5'Wr*g޶dI4(X W94m5~?irnGHDCԘ %o)-ktеׯ=1}'Ak`#/3L"Z+´D 8`@7^&IhĨn)p%fFˀu:k%8@=oEM퓠 {L]HF(Qo :'? }lT3X5ʯ=@a ,A5H)WdG%оϤ~FR=_i> 6gǀAM"HPu:bexn[랁++*&QF26HԭhߟWk=/=[$OmC%}(?Ps+&RMZ<IMzU5E%BIT D{hL)S =Qn稃}lCTg$ Ba m›GP~~I} zK/DsS,ntB؟Nޖ`{5`q@yΌdS?z=8a>ik[;2Ƌјo)0p ?}4oYfԣw*sH)MjCShm'!T&|Ś1 گ*6}.1:%/\O>=;N&.]p`c;%.v8%>%tEXtdate:create2015-12-23T16:43:26-05:00{f%tEXtdate:modify2015-12-23T16:41:02-05:00c- IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/switch_icon.png0000644000175600017570000000034712672631600027163 0ustar pravipraviPNG  IHDR2IDATxc `d@ m6990@ ai?wȴaa"(}]rvwfpf"K~+@0}= 2 ! mZu@;;ַNoWQLrLoV19o 6#1\0! 6 wa,H *IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/move.png0000644000175600017570000000030512672631600025612 0ustar pravipraviPNG  IHDR sIDATxՕ C! DـFbąO(`&߯x'+=u^um@ٚ pB*0may P褍:Kͧ?g>UGxy1_zIENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/images.png0000644000175600017570000001333112672631600026114 0ustar pravipraviPNG  IHDR, 1B ϲ( a6&Rn={/ñaUN}>+VaÆ?deer} v>}-C1 @$2kjWC&TL'N1q rdIʕ+3fL^jUypLnϜ9sq¼ y|]傓8΄0y={eytD|h۷YF m?9cRin p8^k|gڨQ _|EE~X<(NtY:v옶e7*{ĉƍ{7/Nn\vo: T&uv=Fh׮sqp,`S録bA49z(:uv5x_?Z;~cC,J1d n#AO_*1LRr b(%[IEy+r t'x̬Y5f̘{W1IIIU|̹f &-[18\ݦM8\g<0{8EYݍ<5wcga\ʔ54 Q:Ϩ銟(eJf<AQ?~֋TǍ97(ӯJ髯9| o,o!Q!o޼yı /%O{|ƨSE)TٍDi$1/JjnN_G*jEz SX9#Fx3U*]tzN,>y uu rFGCN_E4PjH !(e2n፯ZW#"s'xhȐ!ŘjI&(9cm.syO)裏X}T/4]CnȚFL2%1GuM)kRt}$Ckǀ=qѣGJ*8>8s8N`:Z0'Xf>M9ְfjH,p >{/9s vV1E"]%.z2qLv`1\~M[^kN^q r@/LI _֭W<mO6mVc19&.h:<}zyYi9gF~nܹ]l߾,<3<&ipc8t0q-e{p=Fu}jǎ? kĆcbpX*6@v  P9)p7hɹMYOU_g%xn_SSC~z^ -Q>$,Kr$nj9Dl$\Uq^ &4P<HE|n9 5k2w#5evY_I?Y_D|gӹ1-nHgAVTTnEnIG1ÝBhbE #n9v R HroD0dCڧ0@(3H> J"JQ _i~45ҮӅGU)<2S6|֦{lEɢx(o@Ft$,tHrC>@:V%iQ3M &\Q:h4TohFO>L5锽АW&>Q^cܹ ך,κV +]F`kR"s6zX2X'U~_n!o TCugxO SG}=fUKbP5벦|d4暒#`;%a9)XfZz4_  Tr,UfAQ*KJ סNeqE U D:y$9r$Tx ճ|4+kV,A@kW1cP#\P($`Y˚ۻ:8_qf g/̹T1NMX*MMFRU 9.`(|>=(<@ 4Pr$6스 / Kl8 k`-f$^ kY˜YWfӽ=@ -E_-RijM??&?42j7`)(T.SY/n$l_n-@''NBbe,J I"hbP5M$`e f}Sb3#HĖ]%dYfY[ěXf=8mUUUUUUaB8 àhCW㙨IڅhnB;+^J295JŹa i%I@$؊vzSȠC!t#~9ax0!YAx)#î: uhx20]DΪG֣9XpqL8J0zk4(:,*YJȣnܞv!(``U.&li8ʁKl(ݰ‹81QaV;ylLX rc-`*,JHc <(! K{؍6QA?. GЁ؍`)ʢS^{`0`2yq?cqxgع G .aW$- ;KQʷttW8‚V8Z`2y4÷a 8:jeTDpexLp4"82`9]0Qfx\jQxp#D90|Nx-*4l2?_w]؊:XD+9L(PWG2>a!ЁUnDY}8uK^*WSաV̏L\EQfp1%2<,eQ(ZaUzx@oG6v<(]}ȣ,!ݰ `)8g@}p &2jzqsj4`%6p Eæس6A4 rAj)|ϰ&,%Sq+P:TEAM0}:$`ԿA))AJ@J)))AJ@J))!RRR % %H H RRR % %H H RRR % %H H RRR % %H H RRR % %H H RRR % %H H RRR % %H H RRR))AJ@J))AJ@J))AJ@J))AJ@J)ρ % %H H RR % %H H RR % %H H RR % %H H RR % %H H RR % %H H RR % %H H RR % %H H RR % %H H RRaIENDB`././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/solarized-light-scheme-preview.pnggitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/solarized-light-scheme-p0000644000175600017570000000602712672631600030670 0ustar pravipraviPNG  IHDRdԬ IDATxoZG[ԼVU)yr/rH+<EM-vQCQl+H XPR ]{KBm. qcUE9\26,&^#}h>̝Ùa_+<|@I Q#`0 ?[vdL bz6[_yC_L/uNF.k6_Y}[hQ习+Ai`_J=.FG}s& _<56q=us/P{شʾ16sC %46O_V+ş^Ӥ5>kF؟++x> U륌V_(( %VIK}^0 =$2tI7 LքV:k z?eS1ޞ[Z}A=1}10\yVMR SWcKwo](lx8y5miͲ JF~jF]! h&<ZX_/jOt/k>~u>ZP@/C_ Ъ,_!4VYOTh1zuѻG-%w{ו{L/c[\5o+*& nTT Z($EK\o楞ZxEVߓOZЯ (o*}EUtCѬz] ԛA>$=j 0_X+;`?]r}T7ƖLUj<01)K\^IWgR#\P΅ c%pe6*PPTlzWNu/^ :O`[9hwFg%!X% P2;d-)}Zm,(՜+- cͮP{ ^LYM_g }Tخ}=Zrt,tR 00Fn#вd~nIƟ}cp ]upr 2tz05+՟ Kzz6$>2pϱɝÛECw:[뷽%wqvޕ'E]d\&3+2'5iΘz(<2㥳tJGܔdzRwV'$k,zzoLT7Fԟ2 zµ$`Kiv=+Yo.}>&9sZhJVǫ9Ho&G(BF!`v|Axlf5'Sti.+kQ\#n>v{IxO߿8B>5kucۮ.( [PϢ5Nh 0 ԃ!U,X]4W^ ̄!F۳*cK/ Pl׍t Oa R5b|-LII@D eKP)T`=˖w\w _b]k/9Qh8fTK4v FcХK}J0w$K^ŴNv Tg޸1,q~Cz=k^`8dZ Gp!L59,uRN; HcL3C'j t P>?tݼ+mܥ}cB`Nϯ ʂhi|}mO`-?ϙJ 3zp!%9|!#[=%"c?M?ct͖ ̎)1C.O 50\x2{{>;G2tyفQWM9H)\8"'쀮R@ j?se<ϛp<"yٖC &$N5v@Tx?uTgѹ%ȂlR/T4)VetM |].|-ŸjL_^M8*c_Y4ɟd.&Jav@ל$k0;ypnq&S7v@ׄd+A_~֌YQhJ# +YUvaM7*0F!`F0 pDSV19:_0#[\9g VvdZ[su|!#]JSǮκm׌S=&#79%*uoLٙȵO潞L\NPi$FL^ svf3-0[`v*003њ03 I2B 0QQ076T9_:JV&vGz0|t]ǑΒܤ{Qs4u̙j' U`y9슨/^EI.t `B(BB~0K&E}~`Q?t^Y mW UIDjwRfM~0kf̝ JFe[\㓢5v/:.=N6`,̝ `Hv%1v$K]rp:Y.y<wlff,9&kPQvs7YK??c3 0{gi8x)}u\@!`F!`Sԅ?IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/images/bg-header.png0000644000175600017570000000013212672631600026460 0ustar pravipraviPNG  IHDRF.!IDATxccy 7/߿X~ YY "IENDB`gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/0000755000175600017570000000000012672631600025224 5ustar pravipravi././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/protected_branches.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/protected_branches.0000644000175600017570000000104012672631600031056 0ustar pravipravi$ -> $(".protected-branches-list :checkbox").change (e) -> name = $(this).attr("name") if name == "developers_can_push" id = $(this).val() checked = $(this).is(":checked") url = $(this).data("url") $.ajax type: "PUT" url: url dataType: "json" data: id: id developers_can_push: checked success: -> row = $(e.target) row.closest('tr').effect('highlight') error: -> new Flash("Failed to update branch!", "alert") ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/shortcuts_issuable.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/shortcuts_issuable.0000644000175600017570000000331312672631600031152 0ustar pravipravi#= require mousetrap #= require shortcuts_navigation class @ShortcutsIssuable extends ShortcutsNavigation constructor: (isMergeRequest) -> super() Mousetrap.bind('a', -> $('.block.assignee .edit-link').trigger('click') return false ) Mousetrap.bind('m', -> $('.block.milestone .edit-link').trigger('click') return false ) Mousetrap.bind('r', => @replyWithSelectedText() return false ) Mousetrap.bind('j', => @prevIssue() return false ) Mousetrap.bind('k', => @nextIssue() return false ) if isMergeRequest @enabledHelp.push('.hidden-shortcut.merge_requests') else @enabledHelp.push('.hidden-shortcut.issues') prevIssue: -> $prevBtn = $('.prev-btn') if not $prevBtn.hasClass('disabled') Turbolinks.visit($prevBtn.attr('href')) nextIssue: -> $nextBtn = $('.next-btn') if not $nextBtn.hasClass('disabled') Turbolinks.visit($nextBtn.attr('href')) replyWithSelectedText: -> if window.getSelection selected = window.getSelection().toString() replyField = $('.js-main-target-form #note_note') return if selected.trim() == "" # Put a '>' character before each non-empty line in the selection quote = _.map selected.split("\n"), (val) -> "> #{val}\n" if val.trim() != '' # If replyField already has some content, add a newline before our quote separator = replyField.val().trim() != "" and "\n" or '' replyField.val (_, current) -> current + separator + quote.join('') + "\n" # Trigger autosave for the added text replyField.trigger('input') # Focus the input field replyField.focus() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/network.js.coffee0000644000175600017570000000040412672631600030477 0ustar pravipraviclass @Network constructor: (opts) -> $("#filter_ref").click -> $(this).closest('form').submit() @branch_graph = new BranchGraph($(".network-graph"), opts) vph = $(window).height() - 250 $('.network-graph').css 'height': (vph + 'px') ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/groups_select.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/groups_select.js.co0000644000175600017570000000227412672631600031045 0ustar pravipraviclass @GroupsSelect constructor: -> $('.ajax-groups-select').each (i, select) => skip_ldap = $(select).hasClass('skip_ldap') $(select).select2 placeholder: "Search for a group" multiple: $(select).hasClass('multiselect') minimumInputLength: 0 query: (query) -> Api.groups query.term, skip_ldap, (groups) -> data = { results: groups } query.callback(data) initSelection: (element, callback) -> id = $(element).val() if id isnt "" Api.group(id, callback) formatResult: (args...) => @formatResult(args...) formatSelection: (args...) => @formatSelection(args...) dropdownCssClass: "ajax-groups-dropdown" escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results m formatResult: (group) -> if group.avatar_url avatar = group.avatar_url else avatar = gon.default_avatar_url "

    " formatSelection: (group) -> group.name ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/markdown_preview.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/markdown_preview.js0000644000175600017570000000475212672631600031155 0ustar pravipravi# MarkdownPreview # # Handles toggling the "Write" and "Preview" tab clicks, rendering the preview, # and showing a warning when more than `x` users are referenced. # class @MarkdownPreview # Minimum number of users referenced before triggering a warning referenceThreshold: 10 showPreview: (form) -> preview = form.find('.js-md-preview') mdText = form.find('textarea.markdown-area').val() if mdText.trim().length == 0 preview.text('Nothing to preview.') @hideReferencedUsers(form) else preview.text('Loading...') @renderMarkdown mdText, (response) => preview.html(response.body) preview.syntaxHighlight() @renderReferencedUsers(response.references.users, form) renderMarkdown: (text, success) -> return unless window.markdown_preview_path $.ajax type: 'POST' url: window.markdown_preview_path data: { text: text } dataType: 'json' success: success hideReferencedUsers: (form) -> referencedUsers = form.find('.referenced-users') referencedUsers.hide() renderReferencedUsers: (users, form) -> referencedUsers = form.find('.referenced-users') if referencedUsers.length if users.length >= @referenceThreshold referencedUsers.show() referencedUsers.find('.js-referenced-users-count').text(users.length) else referencedUsers.hide() markdownPreview = new MarkdownPreview() previewButtonSelector = '.js-md-preview-button' writeButtonSelector = '.js-md-write-button' $.fn.setupMarkdownPreview = -> $form = $(this) form_textarea = $form.find('textarea.markdown-area') form_textarea.on 'input', -> markdownPreview.hideReferencedUsers($form) form_textarea.on 'blur', -> markdownPreview.showPreview($form) $(document).on 'click', previewButtonSelector, (e) -> e.preventDefault() $form = $(this).closest('form') # toggle tabs $form.find(writeButtonSelector).parent().removeClass('active') $form.find(previewButtonSelector).parent().addClass('active') # toggle content $form.find('.md-write-holder').hide() $form.find('.md-preview-holder').show() markdownPreview.showPreview($form) $(document).on 'click', writeButtonSelector, (e) -> e.preventDefault() $form = $(this).closest('form') # toggle tabs $form.find(writeButtonSelector).parent().addClass('active') $form.find(previewButtonSelector).parent().removeClass('active') # toggle content $form.find('.md-write-holder').show() $form.find('.md-preview-holder').hide() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/sidebar.js.coffee0000644000175600017570000000117612672631600030426 0ustar pravipravi$(document).on("click", '.toggle-nav-collapse', (e) -> e.preventDefault() collapsed = 'page-sidebar-collapsed' expanded = 'page-sidebar-expanded' $('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}") $('header').toggleClass("header-collapsed header-expanded") $('.sidebar-wrapper').toggleClass("sidebar-collapsed sidebar-expanded") $('.toggle-nav-collapse i').toggleClass("fa-angle-right fa-angle-left") $.cookie("collapsed_nav", $('.page-with-sidebar').hasClass(collapsed), { path: '/' }) setTimeout ( -> niceScrollBars = $('.nicescroll').niceScroll(); niceScrollBars.updateScrollBar(); ), 300 ) ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/stat_graph_contributors_util.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/stat_graph_contribu0000644000175600017570000000576212672631600031222 0ustar pravipraviwindow.ContributorsStatGraphUtil = parse_log: (log) -> total = {} by_author = {} by_email = {} for entry in log @add_date(entry.date, total) unless total[entry.date]? data = by_author[entry.author_name] || by_email[entry.author_email] data ?= @add_author(entry, by_author, by_email) @add_date(entry.date, data) unless data[entry.date] @store_data(entry, total[entry.date], data[entry.date]) total = _.toArray(total) by_author = _.toArray(by_author) total: total, by_author: by_author add_date: (date, collection) -> collection[date] = {} collection[date].date = date add_author: (author, by_author, by_email) -> data = {} data.author_name = author.author_name data.author_email = author.author_email by_author[author.author_name] = data by_email[author.author_email] = data store_data: (entry, total, by_author) -> @store_commits(total, by_author) @store_additions(entry, total, by_author) @store_deletions(entry, total, by_author) store_commits: (total, by_author) -> @add(total, "commits", 1) @add(by_author, "commits", 1) add: (collection, field, value) -> collection[field] ?= 0 collection[field] += value store_additions: (entry, total, by_author) -> entry.additions ?= 0 @add(total, "additions", entry.additions) @add(by_author, "additions", entry.additions) store_deletions: (entry, total, by_author) -> entry.deletions ?= 0 @add(total, "deletions", entry.deletions) @add(by_author, "deletions", entry.deletions) get_total_data: (parsed_log, field) -> log = parsed_log.total total_data = @pick_field(log, field) _.sortBy(total_data, (d) -> d.date ) pick_field: (log, field) -> total_data = [] _.each(log, (d) -> total_data.push(_.pick(d, [field, 'date'])) ) total_data get_author_data: (parsed_log, field, date_range = null) -> log = parsed_log.by_author author_data = [] _.each(log, (log_entry) => parsed_log_entry = @parse_log_entry(log_entry, field, date_range) if not _.isEmpty(parsed_log_entry.dates) author_data.push(parsed_log_entry) ) _.sortBy(author_data, (d) -> d[field] ).reverse() parse_log_entry: (log_entry, field, date_range) -> parsed_entry = {} parsed_entry.author_name = log_entry.author_name parsed_entry.author_email = log_entry.author_email parsed_entry.dates = {} parsed_entry.commits = parsed_entry.additions = parsed_entry.deletions = 0 _.each(_.omit(log_entry, 'author_name', 'author_email'), (value, key) => if @in_range(value.date, date_range) parsed_entry.dates[value.date] = value[field] parsed_entry.commits += value.commits parsed_entry.additions += value.additions parsed_entry.deletions += value.deletions ) return parsed_entry in_range: (date, date_range) -> if date_range is null || date_range[0] <= new Date(date) <= date_range[1] true else false././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/syntax_highlight.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/syntax_highlight.co0000644000175600017570000000117512672631600031130 0ustar pravipravi# Syntax Highlighter # # Applies a syntax highlighting color scheme CSS class to any element with the # `js-syntax-highlight` class # # ### Example Markup # #
    # $.fn.syntaxHighlight = -> if $(this).hasClass('js-syntax-highlight') # Given the element itself, apply highlighting $(this).addClass(gon.user_color_scheme) else # Given a parent element, recurse to any of its applicable children $children = $(this).find('.js-syntax-highlight') $children.syntaxHighlight() if $children.length $(document).on 'ready page:load', -> $('.js-syntax-highlight').syntaxHighlight() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/tree.js.coffee0000644000175600017570000000264512672631600027756 0ustar pravipraviclass @TreeView constructor: -> @initKeyNav() # Code browser tree slider # Make the entire tree-item row clickable, but not if clicking another link (like a commit message) $(".tree-content-holder .tree-item").on 'click', (e) -> if (e.target.nodeName != "A") path = $('.tree-item-file-name a', this).attr('href') Turbolinks.visit(path) # Show the "Loading commit data" for only the first element $('span.log_loading:first').removeClass('hide') initKeyNav: -> li = $("tr.tree-item") liSelected = null $('body').keydown (e) -> if $("input:focus").length > 0 && (e.which == 38 || e.which == 40) return false if e.which is 40 if liSelected next = liSelected.next() if next.length > 0 liSelected.removeClass "selected" liSelected = next.addClass("selected") else liSelected = li.eq(0).addClass("selected") $(liSelected).focus() else if e.which is 38 if liSelected next = liSelected.prev() if next.length > 0 liSelected.removeClass "selected" liSelected = next.addClass("selected") else liSelected = li.last().addClass("selected") $(liSelected).focus() else if e.which is 13 path = $('.tree-item.selected .tree-item-file-name a').attr('href') if path then Turbolinks.visit(path) ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/issuable_form.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/issuable_form.js.co0000644000175600017570000000145112672631600031015 0ustar pravipraviclass @IssuableForm constructor: (@form) -> GitLab.GfmAutoComplete.setup() new UsersSelect() new ZenMode() @titleField = @form.find("input[name*='[title]']") @descriptionField = @form.find("textarea[name*='[description]']") return unless @titleField.length && @descriptionField.length @initAutosave() @form.on "submit", @resetAutosave @form.on "click", ".btn-cancel", @resetAutosave initAutosave: -> new Autosave @titleField, [ document.location.pathname, document.location.search, "title" ] new Autosave @descriptionField, [ document.location.pathname, document.location.search, "description" ] resetAutosave: => @titleField.data("autosave").reset() @descriptionField.data("autosave").reset() ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/new_commit_form.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/new_commit_form.js.0000644000175600017570000000130112672631600031017 0ustar pravipraviclass @NewCommitForm constructor: (form) -> @newBranch = form.find('.js-target-branch') @originalBranch = form.find('.js-original-branch') @createMergeRequest = form.find('.js-create-merge-request') @createMergeRequestContainer = form.find('.js-create-merge-request-container') @renderDestination() @newBranch.keyup @renderDestination renderDestination: => different = @newBranch.val() != @originalBranch.val() if different @createMergeRequestContainer.show() @createMergeRequest.prop('checked', true) unless @wasDifferent else @createMergeRequestContainer.hide() @createMergeRequest.prop('checked', false) @wasDifferent = different ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/projects_list.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/projects_list.js.co0000644000175600017570000000175412672631600031055 0ustar pravipraviclass @ProjectsList constructor: -> $(".projects-list .js-expand").on 'click', (e) -> e.preventDefault() $projectsList = $(this).closest('.projects-list') ProjectsList.showPagination($projectsList) $projectsList.find('li.bottom').hide() $("#filter_projects").on 'keyup', -> ProjectsList.filter_results($("#filter_projects")) @showPagination: ($projectsList) -> $projectsList.find('li').show() $('.gl-pagination').show() @filter_results: ($element) -> terms = $element.val() filterSelector = $element.data('filter-selector') || 'span.filter-title' $projectsList = $('.projects-list') if not terms ProjectsList.showPagination($projectsList) else $projectsList.find('li').each (index) -> $this = $(this) name = $this.find(filterSelector).text() if name.toLowerCase().indexOf(terms.toLowerCase()) == -1 $this.hide() else $this.show() $('.gl-pagination').hide() ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/group_avatar.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/group_avatar.js.cof0000644000175600017570000000057212672631600031026 0ustar pravipraviclass @GroupAvatar constructor: -> $('.js-choose-group-avatar-button').bind "click", -> form = $(this).closest("form") form.find(".js-group-avatar-input").click() $('.js-group-avatar-input').bind "change", -> form = $(this).closest("form") filename = $(this).val().replace(/^.*[\\\/]/, '') form.find(".js-avatar-filename").text(filename) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/commit.js.coffee0000644000175600017570000000013612672631600030300 0ustar pravipraviclass @Commit constructor: -> $('.files .diff-file').each -> new CommitFile(this) ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/application.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/application.js.coff0000644000175600017570000002135712672631600031011 0ustar pravipravi# This is a manifest file that'll be compiled into including all the files listed below. # Add new JavaScript/Coffee code in separate files in this directory and they'll automatically # be included in the compiled file accessible from http://example.com/assets/application.js # It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the # the compiled file. # #= require jquery #= require jquery-ui/autocomplete #= require jquery-ui/datepicker #= require jquery-ui/effect-highlight #= require jquery-ui/sortable #= require jquery_ujs #= require jquery.cookie #= require jquery.endless-scroll #= require jquery.highlight #= require jquery.waitforimages #= require jquery.atwho #= require jquery.scrollTo #= require jquery.turbolinks #= require d3 #= require cal-heatmap #= require turbolinks #= require autosave #= require bootstrap #= require select2 #= require raphael #= require g.raphael #= require g.bar #= require Chart #= require branch-graph #= require ace/ace #= require ace/ext-searchbox #= require underscore #= require nprogress #= require nprogress-turbolinks #= require dropzone #= require mousetrap #= require mousetrap/pause #= require shortcuts #= require shortcuts_navigation #= require shortcuts_dashboard_navigation #= require shortcuts_issuable #= require shortcuts_network #= require jquery.nicescroll #= require_tree . #= require fuzzaldrin-plus window.slugify = (text) -> text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() window.ajaxGet = (url) -> $.ajax({type: "GET", url: url, dataType: "script"}) window.split = (val) -> return val.split( /,\s*/ ) window.extractLast = (term) -> return split( term ).pop() window.rstrip = (val) -> return if val then val.replace(/\s+$/, '') else val # Disable button if text field is empty window.disableButtonIfEmptyField = (field_selector, button_selector) -> field = $(field_selector) closest_submit = field.closest('form').find(button_selector) closest_submit.disable() if rstrip(field.val()) is "" field.on 'input', -> if rstrip($(@).val()) is "" closest_submit.disable() else closest_submit.enable() # Disable button if any input field with given selector is empty window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) -> closest_submit = form.find(button_selector) updateButtons = -> filled = true form.find('input').filter(form_selector).each -> filled = rstrip($(this).val()) != "" || !$(this).attr('required') if filled closest_submit.enable() else closest_submit.disable() updateButtons() form.keyup(updateButtons) window.sanitize = (str) -> return str.replace(/<(?:.|\n)*?>/gm, '') window.unbindEvents = -> $(document).off('scroll') window.shiftWindow = -> scrollBy 0, -100 document.addEventListener("page:fetch", unbindEvents) window.addEventListener "hashchange", shiftWindow window.onload = -> # Scroll the window to avoid the topnav bar # https://github.com/twitter/bootstrap/issues/1768 if location.hash setTimeout shiftWindow, 100 $ -> $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") # Click a .js-select-on-focus field, select the contents $(".js-select-on-focus").on "focusin", -> # Prevent a mouseup event from deselecting the input $(this).select().one 'mouseup', (e) -> e.preventDefault() $('.remove-row').bind 'ajax:success', -> $(this).closest('li').fadeOut() $('.js-remove-tr').bind 'ajax:before', -> $(this).hide() $('.js-remove-tr').bind 'ajax:success', -> $(this).closest('tr').fadeOut() # Initialize select2 selects $('select.select2').select2(width: 'resolve', dropdownAutoWidth: true) # Close select2 on escape $('.js-select2').bind 'select2-close', -> setTimeout ( -> $('.select2-container-active').removeClass('select2-container-active') $(':focus').blur() ), 1 # Initialize tooltips $('body').tooltip( selector: '.has_tooltip, [data-toggle="tooltip"]' placement: (_, el) -> $el = $(el) $el.data('placement') || 'bottom' ) $('.header-logo .home').tooltip( placement: (_, el) -> $el = $(el) if $('.page-with-sidebar').hasClass('page-sidebar-collapsed') then 'right' else 'bottom' container: 'body' ) $('.page-with-sidebar').tooltip( selector: '.sidebar-collapsed .nav-sidebar a, .sidebar-collapsed a.sidebar-user' placement: 'right' container: 'body' ) # Form submitter $('.trigger-submit').on 'change', -> $(@).parents('form').submit() $('abbr.timeago, .js-timeago').timeago() # Flash if (flash = $(".flash-container")).length > 0 flash.click -> $(@).fadeOut() flash.show() # Disable form buttons while a form is submitting $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> buttons = $('[type="submit"]', @) switch e.type when 'ajax:beforeSend', 'submit' buttons.disable() else buttons.enable() # Show/Hide the profile menu when hovering the account box $('.account-box').hover -> $(@).toggleClass('hover') # Commit show suppressed diff $(document).on 'click', '.diff-content .js-show-suppressed-diff', -> $container = $(@).parent() $container.next('table').show() $container.remove() $('.navbar-toggle').on 'click', -> $('.header-content .title').toggle() $('.header-content .navbar-collapse').toggle() $('.navbar-toggle').toggleClass('active') # Show/hide comments on diff $("body").on "click", ".js-toggle-diff-comments", (e) -> $(@).toggleClass('active') $(@).closest(".diff-file").find(".notes_holder").toggle() e.preventDefault() $(document).off "click", '.js-confirm-danger' $(document).on "click", '.js-confirm-danger', (e) -> e.preventDefault() btn = $(e.target) text = btn.data("confirm-danger-message") form = btn.closest("form") new ConfirmDangerModal(form, text) $('input[type="search"]').each -> $this = $(this) $this.attr 'value', $this.val() return $(document) .off 'keyup', 'input[type="search"]' .on 'keyup', 'input[type="search"]' , (e) -> $this = $(this) $this.attr 'value', $this.val() $(document) .off 'breakpoint:change' .on 'breakpoint:change', (e, breakpoint) -> if breakpoint is 'sm' or breakpoint is 'xs' $gutterIcon = $('.gutter-toggle').find('i') if $gutterIcon.hasClass('fa-angle-double-right') $gutterIcon.closest('a').trigger('click') $(document) .off 'click', 'aside .gutter-toggle' .on 'click', 'aside .gutter-toggle', (e) -> e.preventDefault() $this = $(this) $thisIcon = $this.find 'i' if $thisIcon.hasClass('fa-angle-double-right') $thisIcon .removeClass('fa-angle-double-right') .addClass('fa-angle-double-left') $this .closest('aside') .removeClass('right-sidebar-expanded') .addClass('right-sidebar-collapsed') $('.page-with-sidebar') .removeClass('right-sidebar-expanded') .addClass('right-sidebar-collapsed') else $thisIcon .removeClass('fa-angle-double-left') .addClass('fa-angle-double-right') $this .closest('aside') .removeClass('right-sidebar-collapsed') .addClass('right-sidebar-expanded') $('.page-with-sidebar') .removeClass('right-sidebar-collapsed') .addClass('right-sidebar-expanded') $.cookie("collapsed_gutter", $('.right-sidebar') .hasClass('right-sidebar-collapsed'), { path: '/' }) bootstrapBreakpoint = undefined; checkBootstrapBreakpoints = -> if $('.device-xs').is(':visible') bootstrapBreakpoint = "xs" else if $('.device-sm').is(':visible') bootstrapBreakpoint = "sm" else if $('.device-md').is(':visible') bootstrapBreakpoint = "md" else if $('.device-lg').is(':visible') bootstrapBreakpoint = "lg" setBootstrapBreakpoints = -> if $('.device-xs').length return $("body") .append('
    '+ '
    '+ '
    '+ '
    ') checkBootstrapBreakpoints() fitSidebarForSize = -> oldBootstrapBreakpoint = bootstrapBreakpoint checkBootstrapBreakpoints() if bootstrapBreakpoint != oldBootstrapBreakpoint $(document).trigger('breakpoint:change', [bootstrapBreakpoint]) checkInitialSidebarSize = -> if bootstrapBreakpoint is "xs" or "sm" $(document).trigger('breakpoint:change', [bootstrapBreakpoint]) $(window) .off "resize" .on "resize", (e) -> fitSidebarForSize() setBootstrapBreakpoints() checkInitialSidebarSize() new Aside() ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/line_highlighter.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/line_highlighter.js0000644000175600017570000001054112672631600031070 0ustar pravipravi# LineHighlighter # # Handles single- and multi-line selection and highlight for blob views. # #= require jquery.scrollTo # # ### Example Markup # #
    #
    #
    # 1 # 2 # 3 # 4 # 5 #
    #
    #         
    #           ...
    #           ...
    #           ...
    #           ...
    #           ...
    #         
    #       
    #
    #
    # class @LineHighlighter # CSS class applied to highlighted lines highlightClass: 'hll' # Internal copy of location.hash so we're not dependent on `location` in tests _hash: '' # Initialize a LineHighlighter object # # hash - String URL hash for dependency injection in tests constructor: (hash = location.hash) -> @_hash = hash @bindEvents() unless hash == '' range = @hashToRange(hash) if range[0] @highlightRange(range) # Scroll to the first highlighted line on initial load # Offset -50 for the sticky top bar, and another -100 for some context $.scrollTo("#L#{range[0]}", offset: -150) bindEvents: -> $('#blob-content-holder').on 'mousedown', 'a[data-line-number]', @clickHandler # While it may seem odd to bind to the mousedown event and then throw away # the click event, there is a method to our madness. # # If not done this way, the line number anchor will sometimes keep its # active state even when the event is cancelled, resulting in an ugly border # around the link and/or a persisted underline text decoration. $('#blob-content-holder').on 'click', 'a[data-line-number]', (event) -> event.preventDefault() clickHandler: (event) => event.preventDefault() @clearHighlight() lineNumber = $(event.target).closest('a').data('line-number') current = @hashToRange(@_hash) unless current[0] && event.shiftKey # If there's no current selection, or there is but Shift wasn't held, # treat this like a single-line selection. @setHash(lineNumber) @highlightLine(lineNumber) else if event.shiftKey if lineNumber < current[0] range = [lineNumber, current[0]] else range = [current[0], lineNumber] @setHash(range[0], range[1]) @highlightRange(range) # Unhighlight previously highlighted lines clearHighlight: -> $(".#{@highlightClass}").removeClass(@highlightClass) # Convert a URL hash String into line numbers # # hash - Hash String # # Examples: # # hashToRange('#L5') # => [5, null] # hashToRange('#L5-15') # => [5, 15] # hashToRange('#foo') # => [null, null] # # Returns an Array hashToRange: (hash) -> matches = hash.match(/^#?L(\d+)(?:-(\d+))?$/) if matches && matches.length first = parseInt(matches[1]) last = if matches[2] then parseInt(matches[2]) else null [first, last] else [null, null] # Highlight a single line # # lineNumber - Line number to highlight highlightLine: (lineNumber) => $("#LC#{lineNumber}").addClass(@highlightClass) # Highlight all lines within a range # # range - Array containing the starting and ending line numbers highlightRange: (range) -> if range[1] for lineNumber in [range[0]..range[1]] @highlightLine(lineNumber) else @highlightLine(range[0]) # Set the URL hash string setHash: (firstLineNumber, lastLineNumber) => if lastLineNumber hash = "#L#{firstLineNumber}-#{lastLineNumber}" else hash = "#L#{firstLineNumber}" @_hash = hash @__setLocationHash__(hash) # Make the actual hash change in the browser # # This method is stubbed in tests. __setLocationHash__: (value) -> # We're using pushState instead of assigning location.hash directly to # prevent the page from scrolling on the hashchange event history.pushState({turbolinks: false, url: value}, document.title, value) gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/logo.js.coffee0000644000175600017570000000233112672631600027747 0ustar pravipraviNProgress.configure(showSpinner: false) defaultClass = 'tanuki-shape' pieces = [ 'path#tanuki-right-cheek', 'path#tanuki-right-eye, path#tanuki-right-ear', 'path#tanuki-nose', 'path#tanuki-left-eye, path#tanuki-left-ear', 'path#tanuki-left-cheek', ] pieceIndex = 0 firstPiece = pieces[0] currentTimer = null delay = 150 clearHighlights = -> $(".#{defaultClass}.highlight").attr('class', defaultClass) start = -> clearHighlights() pieceIndex = 0 pieces.reverse() unless pieces[0] == firstPiece clearInterval(currentTimer) if currentTimer currentTimer = setInterval(work, delay) stop = -> clearInterval(currentTimer) clearHighlights() work = -> clearHighlights() $(pieces[pieceIndex]).attr('class', "#{defaultClass} highlight") # If we hit the last piece, reset the index and then reverse the array to # get a nice back-and-forth sweeping look if pieceIndex == pieces.length - 1 pieceIndex = 0 pieces.reverse() else pieceIndex++ $(document).on('page:fetch', start) $(document).on('page:change', stop) $ -> # Make logo clickable as part of a workaround for Safari visited # link behaviour (See !2690). $('#logo').on 'click', -> $('#js-shortcuts-home').get(0).click() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/commits.js.coffee0000644000175600017570000000207212672631600030464 0ustar pravipraviclass @CommitsList @timer = null @init: (ref, limit) -> $("body").on "click", ".day-commits-table li.commit", (event) -> if event.target.nodeName != "A" location.href = $(this).attr("url") e.stopPropagation() return false Pager.init limit, false @content = $("#commits-list") @searchField = $("#commits-search") @initSearch() @initSearch: -> @timer = null @searchField.keyup => clearTimeout(@timer) @timer = setTimeout(@filterResults, 500) @filterResults: => form = $(".commits-search-form") search = @searchField.val() commitsUrl = form.attr("action") + '?' + form.serialize() @content.fadeTo('fast', 0.5) $.ajax type: "GET" url: form.attr("action") data: form.serialize() complete: => @content.fadeTo('fast', 1.0) success: (data) => @content.html(data.html) # Change url so if user reload a page - search results are saved history.replaceState {page: commitsUrl}, document.title, commitsUrl dataType: "json" gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/milestone.js.coffee0000644000175600017570000001120212672631600031003 0ustar pravipraviclass @Milestone @updateIssue: (li, issue_url, data) -> $.ajax type: "PUT" url: issue_url data: data success: (data) -> if data.saved == true if data.assignee_avatar_url img_tag = $('') img_tag.attr('src', data.assignee_avatar_url) img_tag.addClass('avatar s16') $(li).find('.assignee-icon').html(img_tag) else $(li).find('.assignee-icon').html('') $(li).effect 'highlight' else new Flash("Issue update failed", 'alert') dataType: "json" @sortIssues: (data) -> sort_issues_url = location.href + "/sort_issues" $.ajax type: "PUT" url: sort_issues_url data: data success: (data) -> if data.saved != true new Flash("Issues update failed", 'alert') dataType: "json" @sortMergeRequests: (data) -> sort_mr_url = location.href + "/sort_merge_requests" $.ajax type: "PUT" url: sort_mr_url data: data success: (data) -> if data.saved != true new Flash("MR update failed", 'alert') dataType: "json" @updateMergeRequest: (li, merge_request_url, data) -> $.ajax type: "PUT" url: merge_request_url data: data success: (data) -> if data.saved == true if data.assignee_avatar_url img_tag = $('') img_tag.attr('src', data.assignee_avatar_url) img_tag.addClass('avatar s16') $(li).find('.assignee-icon').html(img_tag) else $(li).find('.assignee-icon').html('') $(li).effect 'highlight' else new Flash("Issue update failed", 'alert') dataType: "json" constructor: -> oldMouseStart = $.ui.sortable.prototype._mouseStart $.ui.sortable.prototype._mouseStart = (event, overrideHandle, noActivation) -> this._trigger "beforeStart", event, this._uiHash() oldMouseStart.apply this, [event, overrideHandle, noActivation] @bindIssuesSorting() @bindMergeRequestSorting() @bindTabsSwitching bindIssuesSorting: -> $("#issues-list-unassigned, #issues-list-ongoing, #issues-list-closed").sortable( connectWith: ".issues-sortable-list", dropOnEmpty: true, items: "li:not(.ui-sort-disabled)", beforeStart: (event, ui) -> $(".issues-sortable-list").css "min-height", ui.item.outerHeight() stop: (event, ui) -> $(".issues-sortable-list").css "min-height", "0px" update: (event, ui) -> data = $(this).sortable("serialize") Milestone.sortIssues(data) receive: (event, ui) -> new_state = $(this).data('state') issue_id = ui.item.data('iid') issue_url = ui.item.data('url') data = switch new_state when 'ongoing' "issue[assignee_id]=" + gon.current_user_id when 'unassigned' "issue[assignee_id]=" when 'closed' "issue[state_event]=close" if $(ui.sender).data('state') == "closed" data += "&issue[state_event]=reopen" Milestone.updateIssue(ui.item, issue_url, data) ).disableSelection() bindMergeRequestSorting: -> $('a[data-toggle="tab"]').on 'show.bs.tab', (e) -> currentTabClass = $(e.target).data('show') previousTabClass = $(e.relatedTarget).data('show') $(previousTabClass).hide() $(currentTabClass).removeClass('hidden') $(currentTabClass).show() $("#merge_requests-list-unassigned, #merge_requests-list-ongoing, #merge_requests-list-closed").sortable( connectWith: ".merge_requests-sortable-list", dropOnEmpty: true, items: "li:not(.ui-sort-disabled)", beforeStart: (event, ui) -> $(".merge_requests-sortable-list").css "min-height", ui.item.outerHeight() stop: (event, ui) -> $(".merge_requests-sortable-list").css "min-height", "0px" update: (event, ui) -> data = $(this).sortable("serialize") Milestone.sortMergeRequests(data) receive: (event, ui) -> new_state = $(this).data('state') merge_request_id = ui.item.data('iid') merge_request_url = ui.item.data('url') data = switch new_state when 'ongoing' "merge_request[assignee_id]=" + gon.current_user_id when 'unassigned' "merge_request[assignee_id]=" when 'closed' "merge_request[state_event]=close" if $(ui.sender).data('state') == "closed" data += "&merge_request[state_event]=reopen" Milestone.updateMergeRequest(ui.item, merge_request_url, data) ).disableSelection() gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/diff.js.coffee0000644000175600017570000000276612672631600027733 0ustar pravipraviclass @Diff UNFOLD_COUNT = 20 constructor: -> $(document).off('click', '.js-unfold') $(document).on('click', '.js-unfold', (event) => target = $(event.target) unfoldBottom = target.hasClass('js-unfold-bottom') unfold = true [old_line, line_number] = @lineNumbers(target.parent()) offset = line_number - old_line if unfoldBottom line_number += 1 since = line_number to = line_number + UNFOLD_COUNT else [prev_old_line, prev_new_line] = @lineNumbers(target.parent().prev()) line_number -= 1 to = line_number if line_number - UNFOLD_COUNT > prev_new_line + 1 since = line_number - UNFOLD_COUNT else since = prev_new_line + 1 unfold = false link = target.parents('.diff-file').attr('data-blob-diff-path') params = since: since to: to bottom: unfoldBottom offset: offset unfold: unfold # indent is used to compensate for single space indent to fit # '+' and '-' prepended to diff lines, # see https://gitlab.com/gitlab-org/gitlab-ce/issues/707 indent: 1 $.get(link, params, (response) => target.parent().replaceWith(response) ) ) lineNumbers: (line) -> return ([0, 0]) unless line.children().length lines = line.children().slice(0, 2) line_numbers = ($(l).attr('data-linenumber') for l in lines) (parseInt(line_number) for line_number in line_numbers) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/confirm_danger_modal.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/confirm_danger_moda0000644000175600017570000000120412672631600031121 0ustar pravipraviclass @ConfirmDangerModal constructor: (form, text) -> @form = form $('.js-confirm-text').text(text || '') $('.js-confirm-danger-input').val('') $('#modal-confirm-danger').modal('show') project_path = $('.js-confirm-danger-match').text() submit = $('.js-confirm-danger-submit') submit.disable() $('.js-confirm-danger-input').off 'input' $('.js-confirm-danger-input').on 'input', -> if rstrip($(@).val()) is project_path submit.enable() else submit.disable() $('.js-confirm-danger-submit').off 'click' $('.js-confirm-danger-submit').on 'click', => @form.submit() ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/merge_request_tabs.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/merge_request_tabs.0000644000175600017570000001261612672631600031113 0ustar pravipravi# MergeRequestTabs # # Handles persisting and restoring the current tab selection and lazily-loading # content on the MergeRequests#show page. # # ### Example Markup # # # #
    #
    # Notes Content #
    #
    # Commits Content #
    #
    # Diffs Content #
    #
    # #
    #
    # Loading Animation #
    #
    # class @MergeRequestTabs diffsLoaded: false buildsLoaded: false commitsLoaded: false constructor: (@opts = {}) -> # Store the `location` object, allowing for easier stubbing in tests @_location = location @bindEvents() @activateTab(@opts.action) bindEvents: -> $(document).on 'shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', @tabShown $(document).on 'click', '.js-show-tab', @showTab showTab: (event) => event.preventDefault() @activateTab $(event.target).data('action') tabShown: (event) => $target = $(event.target) action = $target.data('action') if action == 'commits' @loadCommits($target.attr('href')) else if action == 'diffs' @loadDiff($target.attr('href')) else if action == 'builds' @loadBuilds($target.attr('href')) @setCurrentAction(action) scrollToElement: (container) -> if window.location.hash $el = $("div#{container} #{window.location.hash}") $('body').scrollTo($el.offset().top) if $el.length # Activate a tab based on the current action activateTab: (action) -> action = 'notes' if action == 'show' $(".merge-request-tabs a[data-action='#{action}']").tab('show') # Replaces the current Merge Request-specific action in the URL with a new one # # If the action is "notes", the URL is reset to the standard # `MergeRequests#show` route. # # Examples: # # location.pathname # => "/namespace/project/merge_requests/1" # setCurrentAction('diffs') # location.pathname # => "/namespace/project/merge_requests/1/diffs" # # location.pathname # => "/namespace/project/merge_requests/1/diffs" # setCurrentAction('notes') # location.pathname # => "/namespace/project/merge_requests/1" # # location.pathname # => "/namespace/project/merge_requests/1/diffs" # setCurrentAction('commits') # location.pathname # => "/namespace/project/merge_requests/1/commits" # # Returns the new URL String setCurrentAction: (action) => # Normalize action, just to be safe action = 'notes' if action == 'show' # Remove a trailing '/commits' or '/diffs' new_state = @_location.pathname.replace(/\/(commits|diffs|builds)(\.html)?\/?$/, '') # Append the new action if we're on a tab other than 'notes' unless action == 'notes' new_state += "/#{action}" # Ensure parameters and hash come along for the ride new_state += @_location.search + @_location.hash # Replace the current history state with the new one without breaking # Turbolinks' history. # # See https://github.com/rails/turbolinks/issues/363 history.replaceState {turbolinks: true, url: new_state}, document.title, new_state new_state loadCommits: (source) -> return if @commitsLoaded @_get url: "#{source}.json" success: (data) => document.querySelector("div#commits").innerHTML = data.html $('.js-timeago').timeago() @commitsLoaded = true @scrollToElement("#commits") loadDiff: (source) -> return if @diffsLoaded @_get url: "#{source}.json" + @_location.search success: (data) => document.querySelector("div#diffs").innerHTML = data.html $('div#diffs .js-syntax-highlight').syntaxHighlight() @expandViewContainer() if @diffViewType() is 'parallel' @diffsLoaded = true @scrollToElement("#diffs") loadBuilds: (source) -> return if @buildsLoaded @_get url: "#{source}.json" success: (data) => document.querySelector("div#builds").innerHTML = data.html $('.js-timeago').timeago() @buildsLoaded = true @scrollToElement("#builds") # Show or hide the loading spinner # # status - Boolean, true to show, false to hide toggleLoading: (status) -> $('.mr-loading-status .loading').toggle(status) _get: (options) -> defaults = { beforeSend: => @toggleLoading(true) complete: => @toggleLoading(false) dataType: 'json' type: 'GET' } options = $.extend({}, defaults, options) $.ajax(options) # Returns diff view type diffViewType: -> $('.inline-parallel-buttons a.active').data('view-type') expandViewContainer: -> $('.container-fluid').removeClass('container-limited') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/star.js.coffee0000644000175600017570000000142012672631600027756 0ustar pravipraviclass @Star constructor: -> $('.project-home-panel .toggle-star').on('ajax:success', (e, data, status, xhr) -> $this = $(this) $starSpan = $this.find('span') $starIcon = $this.find('i') toggleStar = (isStarred) -> $this.parent().find('.star-count').text data.star_count if isStarred $starSpan.removeClass('starred').text 'Star' $starIcon.removeClass('fa-star').addClass 'fa-star-o' else $starSpan.addClass('starred').text 'Unstar' $starIcon.removeClass('fa-star-o').addClass 'fa-star' return toggleStar $starSpan.hasClass('starred') return ).on 'ajax:error', (e, xhr, status, error) -> new Flash('Star toggle failed. Try again later.', 'alert') return gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/extensions/0000755000175600017570000000000012672631600027423 5ustar pravipravi././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/extensions/jquery.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/extensions/jquery.j0000644000175600017570000000045512672631600031121 0ustar pravipravi# Disable an element and add the 'disabled' Bootstrap class $.fn.extend disable: -> $(@) .attr('disabled', 'disabled') .addClass('disabled') # Enable an element and remove the 'disabled' Bootstrap class $.fn.extend enable: -> $(@) .removeAttr('disabled') .removeClass('disabled') gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/extensions/array.js0000644000175600017570000000017612672631600031103 0ustar pravipraviArray.prototype.first = function() { return this[0]; } Array.prototype.last = function() { return this[this.length-1]; } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/autosave.js.coffee0000644000175600017570000000130312672631600030634 0ustar pravipraviclass @Autosave constructor: (field, key) -> @field = field key = key.join("/") if key.join? @key = "autosave/#{key}" @field.data "autosave", this @restore() @field.on "input", => @save() restore: -> return unless window.localStorage? try text = window.localStorage.getItem @key catch return @field.val text if text?.length > 0 @field.trigger "input" save: -> return unless window.localStorage? text = @field.val() if text?.length > 0 try window.localStorage.setItem @key, text else @reset() reset: -> return unless window.localStorage? try window.localStorage.removeItem @key gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/lib/0000755000175600017570000000000012672631600025772 5ustar pravipravi././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/lib/jquery.timeago.jsgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/lib/jquery.timeago.0000644000175600017570000001301712672631600030740 0ustar pravipravi/** * Timeago is a jQuery plugin that makes it easy to support automatically * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). * * @name timeago * @version 1.1.0 * @requires jQuery v1.2.3+ * @author Ryan McGeary * @license MIT License - http://www.opensource.org/licenses/mit-license.php * * For usage and examples, visit: * http://timeago.yarp.com/ * * Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else { // Browser globals factory(jQuery); } }(function ($) { $.timeago = function(timestamp) { if (timestamp instanceof Date) { return inWords(timestamp); } else if (typeof timestamp === "string") { return inWords($.timeago.parse(timestamp)); } else if (typeof timestamp === "number") { return inWords(new Date(timestamp)); } else { return inWords($.timeago.datetime(timestamp)); } }; var $t = $.timeago; $.extend($.timeago, { settings: { refreshMillis: 60000, allowFuture: false, strings: { prefixAgo: null, prefixFromNow: null, suffixAgo: "ago", suffixFromNow: "from now", seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years", wordSeparator: " ", numbers: [] } }, inWords: function(distanceMillis) { var $l = this.settings.strings; var prefix = $l.prefixAgo; var suffix = $l.suffixAgo; if (this.settings.allowFuture) { if (distanceMillis < 0) { prefix = $l.prefixFromNow; suffix = $l.suffixFromNow; } } var seconds = Math.abs(distanceMillis) / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; function substitute(stringOrFunction, number) { var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; var value = ($l.numbers && $l.numbers[number]) || number; return string.replace(/%d/i, value); } var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || seconds < 90 && substitute($l.minute, 1) || minutes < 45 && substitute($l.minutes, Math.round(minutes)) || minutes < 90 && substitute($l.hour, 1) || hours < 24 && substitute($l.hours, Math.round(hours)) || hours < 42 && substitute($l.day, 1) || days < 30 && substitute($l.days, Math.round(days)) || days < 45 && substitute($l.month, 1) || days < 365 && substitute($l.months, Math.round(days / 30)) || years < 1.5 && substitute($l.year, 1) || substitute($l.years, Math.round(years)); var separator = $l.wordSeparator || ""; if ($l.wordSeparator === undefined) { separator = " "; } return $.trim([prefix, words, suffix].join(separator)); }, parse: function(iso8601) { var s = $.trim(iso8601); s = s.replace(/\.\d+/,""); // remove milliseconds s = s.replace(/-/,"/").replace(/-/,"/"); s = s.replace(/T/," ").replace(/Z/," UTC"); s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 return new Date(s); }, datetime: function(elem) { var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); return $t.parse(iso8601); }, isTime: function(elem) { // jQuery's `is()` doesn't play well with HTML5 in IE return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); } }); // functions that can be called via $(el).timeago('action') // init is default when no action is given // functions are called with context of a single element var functions = { init: function(){ var refresh_el = $.proxy(refresh, this); refresh_el(); var $s = $t.settings; if ($s.refreshMillis > 0) { setInterval(refresh_el, $s.refreshMillis); } }, update: function(time){ $(this).data('timeago', { datetime: $t.parse(time) }); refresh.apply(this); } }; $.fn.timeago = function(action, options) { var fn = action ? functions[action] : functions.init; if(!fn){ throw new Error("Unknown function name '"+ action +"' for timeago"); } // each over objects here and call the requested function this.each(function(){ fn.call(this, options); }); return this; }; function refresh() { var data = prepareData(this); if (!isNaN(data.datetime)) { $(this).text(inWords(data.datetime)); } return this; } function prepareData(element) { element = $(element); if (!element.data("timeago")) { element.data("timeago", { datetime: $t.datetime(element) }); var text = $.trim(element.text()); if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { element.attr("title", text); } } return element.data("timeago"); } function inWords(date) { return $t.inWords(distance(date)); } function distance(date) { return (new Date().getTime() - date.getTime()); } // fix for IE6 suckage document.createElement("abbr"); document.createElement("time"); })); gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/lib/md5.js0000644000175600017570000001676412672631600027033 0ustar pravipravifunction md5 (str) { // http://kevin.vanzonneveld.net // + original by: Webtoolkit.info (http://www.webtoolkit.info/) // + namespaced by: Michael White (http://getsprink.com) // + tweaked by: Jack // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // - depends on: utf8_encode // * example 1: md5('Kevin van Zonneveld'); // * returns 1: '6e658d4bfcb59cc13f96c14450ac40b9' var xl; var rotateLeft = function (lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); }; var addUnsigned = function (lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); if (lX4 & lY4) { return (lResult ^ 0x80000000 ^ lX8 ^ lY8); } if (lX4 | lY4) { if (lResult & 0x40000000) { return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); } else { return (lResult ^ 0x40000000 ^ lX8 ^ lY8); } } else { return (lResult ^ lX8 ^ lY8); } }; var _F = function (x, y, z) { return (x & y) | ((~x) & z); }; var _G = function (x, y, z) { return (x & z) | (y & (~z)); }; var _H = function (x, y, z) { return (x ^ y ^ z); }; var _I = function (x, y, z) { return (y ^ (x | (~z))); }; var _FF = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b); }; var _GG = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b); }; var _HH = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b); }; var _II = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b); }; var convertToWordArray = function (str) { var lWordCount; var lMessageLength = str.length; var lNumberOfWords_temp1 = lMessageLength + 8; var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; var lWordArray = new Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount) << lBytePosition)); lByteCount++; } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray; }; var wordToHex = function (lValue) { var wordToHexValue = "", wordToHexValue_temp = "", lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; wordToHexValue_temp = "0" + lByte.toString(16); wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2); } return wordToHexValue; }; var x = [], k, AA, BB, CC, DD, a, b, c, d, S11 = 7, S12 = 12, S13 = 17, S14 = 22, S21 = 5, S22 = 9, S23 = 14, S24 = 20, S31 = 4, S32 = 11, S33 = 16, S34 = 23, S41 = 6, S42 = 10, S43 = 15, S44 = 21; str = this.utf8_encode(str); x = convertToWordArray(str); a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; xl = x.length; for (k = 0; k < xl; k += 16) { AA = a; BB = b; CC = c; DD = d; a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); d = _FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB); b = _FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); d = _FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613); b = _FF(b, c, d, a, x[k + 7], S14, 0xFD469501); a = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8); d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); a = _FF(a, b, c, d, x[k + 12], S11, 0x6B901122); d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193); c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E); b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821); a = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340); c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453); c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681); c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05); a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244); d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97); c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039); a = _II(a, b, c, d, x[k + 12], S41, 0x655B59C3); d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1); a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314); b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82); d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391); a = addUnsigned(a, AA); b = addUnsigned(b, BB); c = addUnsigned(c, CC); d = addUnsigned(d, DD); } var temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); return temp.toLowerCase(); } gitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/lib/utf8_encode.js0000644000175600017570000000414512672631600030537 0ustar pravipravifunction utf8_encode (argString) { // http://kevin.vanzonneveld.net // + original by: Webtoolkit.info (http://www.webtoolkit.info/) // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + improved by: sowberry // + tweaked by: Jack // + bugfixed by: Onno Marsman // + improved by: Yves Sucaet // + bugfixed by: Onno Marsman // + bugfixed by: Ulrich // + bugfixed by: Rafal Kukawski // + improved by: kirilloid // + bugfixed by: kirilloid // * example 1: utf8_encode('Kevin van Zonneveld'); // * returns 1: 'Kevin van Zonneveld' if (argString === null || typeof argString === "undefined") { return ""; } var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n"); var utftext = '', start, end, stringl = 0; start = end = 0; stringl = string.length; for (var n = 0; n < stringl; n++) { var c1 = string.charCodeAt(n); var enc = null; if (c1 < 128) { end++; } else if (c1 > 127 && c1 < 2048) { enc = String.fromCharCode( (c1 >> 6) | 192, ( c1 & 63) | 128 ); } else if (c1 & 0xF800 != 0xD800) { enc = String.fromCharCode( (c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, ( c1 & 63) | 128 ); } else { // surrogate pairs if (c1 & 0xFC00 != 0xD800) { throw new RangeError("Unmatched trail surrogate at " + n); } var c2 = string.charCodeAt(++n); if (c2 & 0xFC00 != 0xDC00) { throw new RangeError("Unmatched lead surrogate at " + (n-1)); } c1 = ((c1 & 0x3FF) << 10) + (c2 & 0x3FF) + 0x10000; enc = String.fromCharCode( (c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, ( c1 & 63) | 128 ); } if (enc !== null) { if (end > start) { utftext += string.slice(start, end); } utftext += enc; start = end = n + 1; } } if (end > start) { utftext += string.slice(start, stringl); } return utftext; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/project_new.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/project_new.js.coff0000644000175600017570000000025312672631600031015 0ustar pravipraviclass @ProjectNew constructor: -> $('.project-edit-container').on 'ajax:before', => $('.project-edit-container').hide() $('.save-project-loader').show() ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/shortcuts_network.js.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/shortcuts_network.j0000644000175600017570000000100212672631600031177 0ustar pravipravi#= require shortcuts_navigation class @ShortcutsNetwork extends ShortcutsNavigation constructor: (@graph) -> super() Mousetrap.bind(['left', 'h'], @graph.scrollLeft) Mousetrap.bind(['right', 'l'], @graph.scrollRight) Mousetrap.bind(['up', 'k'], @graph.scrollUp) Mousetrap.bind(['down', 'j'], @graph.scrollDown) Mousetrap.bind(['shift+up', 'shift+k'], @graph.scrollTop) Mousetrap.bind(['shift+down', 'shift+j'], @graph.scrollBottom) @enabledHelp.push('.hidden-shortcut.network') ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/awards_handler.coffeegitlab-ce-v8.5.8-46bb47accfe4e4246a3ccd4bda1bbf6d180c6308/app/assets/javascripts/awards_handler.coff0000644000175600017570000001235412672631600031046 0ustar pravipraviclass @AwardsHandler constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) -> $(".add-award").click (event)-> event.stopPropagation() event.preventDefault() $(".emoji-menu").show() $("#emoji_search").focus() $("html").on 'click', (event) -> if !$(event.target).closest(".emoji-menu").length if $(".emoji-menu").is(":visible") $(".emoji-menu").hide() @renderFrequentlyUsedBlock() @setupSearch() addAward: (emoji) -> emoji = @normilizeEmojiName(emoji) @postEmoji emoji, => @addAwardToEmojiBar(emoji) $(".emoji-menu").hide() addAwardToEmojiBar: (emoji) -> @addEmojiToFrequentlyUsedList(emoji) emoji = @normilizeEmojiName(emoji) if @exist(emoji) if @isActive(emoji) @decrementCounter(emoji) else counter = @findEmojiIcon(emoji).siblings(".counter") counter.text(parseInt(counter.text()) + 1) counter.parent().addClass("active") @addMeToAuthorList(emoji) else @createEmoji(emoji) exist: (emoji) -> @findEmojiIcon(emoji).length > 0 isActive: (emoji) -> @findEmojiIcon(emoji).parent().hasClass("active") decrementCounter: (emoji) -> counter = @findEmojiIcon(emoji).siblings(".counter") emojiIcon = counter.parent() if parseInt(counter.text()) > 1 counter.text(parseInt(counter.text()) - 1) emojiIcon.removeClass("active") @removeMeFromAuthorList(emoji) else if emoji == "thumbsup" || emoji == "thumbsdown" emojiIcon.tooltip("destroy") counter.text(0) emojiIcon.removeClass("active") @removeMeFromAuthorList(emoji) else emojiIcon.tooltip("destroy") emojiIcon.remove() removeMeFromAuthorList: (emoji) -> award_block = @findEmojiIcon(emoji).parent() authors = award_block.attr("data-original-title").split(", ") authors.splice(authors.indexOf("me"),1) award_block.closest(".award").attr("data-original-title", authors.join(", ")) @resetTooltip(award_block) addMeToAuthorList: (emoji) -> award_block = @findEmojiIcon(emoji).parent() origTitle = award_block.attr("data-original-title").trim() authors = [] if origTitle authors = origTitle.split(', ') authors.push("me") award_block.attr("title", authors.join(", ")) @resetTooltip(award_block) resetTooltip: (award) -> award.tooltip("destroy") # "destroy" call is asynchronous and there is no appropriate callback on it, this is why we need to set timeout. setTimeout (-> award.tooltip() ), 200 createEmoji: (emoji) -> emojiCssClass = @resolveNameToCssClass(emoji) nodes = [] nodes.push("
    ") nodes.push("
    ") nodes.push("
    1
    ") nodes.push("
    ") emoji_node = $(nodes.join("\n")).insertBefore(".awards-controls").find(".emoji-icon").data("emoji", emoji) $(".award").tooltip() resolveNameToCssClass: (emoji) -> emoji_icon = $(".emoji-menu-content [data-emoji='#{emoji}']") if emoji_icon.length > 0 unicodeName = emoji_icon.data("unicode-name") else # Find by alias unicodeName = $(".emoji-menu-content [data-aliases*=':#{emoji}:']").data("unicode-name") "emoji-#{unicodeName}" postEmoji: (emoji, callback) -> $.post @post_emoji_url, { note: { note: ":#{emoji}:" noteable_type: @noteable_type noteable_id: @noteable_id }},(data) -> if data.ok callback.call() findEmojiIcon: (emoji) -> $(".award [data-emoji='#{emoji}']") scrollToAwards: -> $('body, html').animate({ scrollTop: $('.awards').offset().top - 80 }, 200) normilizeEmojiName: (emoji) -> @aliases[emoji] || emoji addEmojiToFrequentlyUsedList: (emoji) -> frequently_used_emojis = @getFrequentlyUsedEmojis() frequently_used_emojis.push(emoji) $.cookie('frequently_used_emojis', frequently_used_emojis.join(","), { expires: 365 }) getFrequentlyUsedEmojis: -> frequently_used_emojis = ($.cookie('frequently_used_emojis') || "").split(",") _.compact(_.uniq(frequently_used_emojis)) renderFrequentlyUsedBlock: -> if $.cookie('frequently_used_emojis') frequently_used_emojis = @getFrequentlyUsedEmojis() ul = $("