Updated runtime and language files.
diff --git a/runtime/indent/sas.vim b/runtime/indent/sas.vim
index d591b27..9cc9e02 100644
--- a/runtime/indent/sas.vim
+++ b/runtime/indent/sas.vim
@@ -1,8 +1,8 @@
 " Vim indent file
 " Language:     SAS
 " Maintainer:   Zhen-Huan Hu <wildkeny@gmail.com>
-" Version:      3.0.1
-" Last Change:  Mar 13, 2017
+" Version:      3.0.3
+" Last Change:  Jun 26, 2018
 
 if exists("b:did_indent")
   finish
@@ -27,9 +27,9 @@
 let s:section_end = '\v%(^|;)\s*%(quit|enddata)\s*;'
 
 " Regex that captures the start of a control block (anything inside a section)
-let s:block_str = '\v<%(do>%([^;]+<%(to|over)>[^;]+)=|%(define|layout|method|select)>[^;]+|begingraph)\s*;'
+let s:block_str = '\v<%(do>%([^;]+<%(to|over|while)>[^;]+)=|%(compute|define\s+%(column|footer|header|style|table|tagset|crosstabs|statgraph)|edit|layout|method|select)>[^;]+|begingraph)\s*;'
 " Regex that captures the end of a control block (anything inside a section)
-let s:block_end = '\v<%(end|endlayout|endgraph)\s*;'
+let s:block_end = '\v<%(end|endcomp|endlayout|endgraph)\s*;'
 
 " Regex that captures the start of a macro
 let s:macro_str = '\v%(^|;)\s*\%macro>'
@@ -52,7 +52,7 @@
   let prev_lnum = prevnonblank(a:lnum - 1)
   while prev_lnum > 0
     let prev_line = getline(prev_lnum)
-    if prev_line =~ a:regex
+    if prev_line =~? a:regex
       break
     else
       let prev_lnum = prevnonblank(prev_lnum - 1)
@@ -71,11 +71,11 @@
     let prev_line = getline(prev_lnum)
     " Previous non-blank line contains the start of a macro/section/block
     " while not the end of a macro/section/block (at the same line)
-    if (prev_line =~ s:section_str && prev_line !~ s:section_run && prev_line !~ s:section_end) ||
-          \ (prev_line =~ s:block_str && prev_line !~ s:block_end) ||
-          \ (prev_line =~ s:macro_str && prev_line !~ s:macro_end)
-      let ind = indent(prev_lnum) + &sts
-    elseif prev_line =~ s:section_run && prev_line !~ s:section_end
+    if (prev_line =~? s:section_str && prev_line !~? s:section_run && prev_line !~? s:section_end) ||
+          \ (prev_line =~? s:block_str && prev_line !~? s:block_end) ||
+          \ (prev_line =~? s:macro_str && prev_line !~? s:macro_end)
+      let ind = indent(prev_lnum) + shiftwidth()
+    elseif prev_line =~? s:section_run && prev_line !~? s:section_end
       let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str)
       let prev_section_end_lnum = max([
             \ s:PrevMatch(v:lnum, s:section_end),
@@ -83,9 +83,9 @@
             \ s:PrevMatch(v:lnum, s:program_end)])
       " Check if the section supports run-processing
       if prev_section_end_lnum < prev_section_str_lnum &&
-            \ getline(prev_section_str_lnum) =~ '\v%(^|;)\s*proc\s+%(' .
+            \ getline(prev_section_str_lnum) =~? '\v%(^|;)\s*proc\s+%(' .
             \ join(s:run_processing_procs, '|') . ')>'
-        let ind = indent(prev_lnum) + &sts
+        let ind = indent(prev_lnum) + shiftwidth()
       else
         let ind = indent(prev_lnum)
       endif
@@ -95,26 +95,26 @@
   endif
   " Re-adjustments based on the inputs of the current line
   let curr_line = getline(v:lnum)
-  if curr_line =~ s:program_end
+  if curr_line =~? s:program_end
     " End of the program
     " Same indentation as the first non-blank line
     return indent(nextnonblank(1))
-  elseif curr_line =~ s:macro_end
+  elseif curr_line =~? s:macro_end
     " Current line is the end of a macro
     " Match the indentation of the start of the macro
     return indent(s:PrevMatch(v:lnum, s:macro_str))
-  elseif curr_line =~ s:block_end && curr_line !~ s:block_str
+  elseif curr_line =~? s:block_end && curr_line !~? s:block_str
     " Re-adjust if current line is the end of a block
     " while not the beginning of a block (at the same line)
     " Returning the indent of previous block start directly
     " would not work due to nesting
-    let ind = ind - &sts
-  elseif curr_line =~ s:section_str || curr_line =~ s:section_run || curr_line =~ s:section_end
+    let ind = ind - shiftwidth()
+  elseif curr_line =~? s:section_str || curr_line =~? s:section_run || curr_line =~? s:section_end
     " Re-adjust if current line is the start/end of a section
     " since the end of a section could be inexplicit
     let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str)
     " Check if the previous section supports run-processing
-    if getline(prev_section_str_lnum) =~ '\v%(^|;)\s*proc\s+%(' .
+    if getline(prev_section_str_lnum) =~? '\v%(^|;)\s*proc\s+%(' .
           \ join(s:run_processing_procs, '|') . ')>'
       let prev_section_end_lnum = max([
             \ s:PrevMatch(v:lnum, s:section_end),
@@ -128,7 +128,7 @@
             \ s:PrevMatch(v:lnum, s:program_end)])
     endif
     if prev_section_end_lnum < prev_section_str_lnum
-      let ind = ind - &sts
+      let ind = ind - shiftwidth()
     endif
   endif
   return ind