Skip to content

[Fix] WTH-363 : 내비게이션 가드 오작동 문제#95

Merged
nabbang6 merged 6 commits intodevelopfrom
WTH-363-내비게이션-가드-오작동-문제
Apr 30, 2026

Hidden character warning

The head ref may contain hidden characters: "WTH-363-\ub0b4\ube44\uac8c\uc774\uc158-\uac00\ub4dc-\uc624\uc791\ub3d9-\ubb38\uc81c"
Merged

[Fix] WTH-363 : 내비게이션 가드 오작동 문제#95
nabbang6 merged 6 commits intodevelopfrom
WTH-363-내비게이션-가드-오작동-문제

Conversation

@nabbang6
Copy link
Copy Markdown
Collaborator

@nabbang6 nabbang6 commented Apr 30, 2026

✅ PR 유형

어떤 변경 사항이 있었나요?

  • 새로운 기능 추가
  • 버그 수정
  • 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

📌 관련 이슈번호

  • Closed #363

✅ Key Changes

  • tiptap 라이브러리가 빈 에디터에서도 '

    ' 등의 HTML을 반환하여 내비게이션 가드가 작동되던 문제 수정
  • 게시글/댓글/마이페이지 작성할 때마다 내비게이션 가드가 수시로 작동되던 문제 수정
  • 이미지 카드 width가 이상하게 보이는 문제 수정
  • 코드블록 표시 안 되는 문제 수정

📸 스크린샷 or 실행영상

내비 가드 문제

2026-04-30.141621.mp4

코드블록

image

🎸 기타 사항 or 추가 코멘트

이게 로컬에서는 잘 되어도... 배포 환경에서 말썽인 경우가 꽤 있어서 ㅠㅠ
vercel 미리보기로 한번 더 확인해보겟습니당....

Summary by CodeRabbit

요약

  • 버그 수정

    • 텍스트 에디터의 미저장 변경 감지 개선 — 빈 HTML만 있을 때 불필요한 경고 제거
    • 뒤로가기 동작 관련 불안정성 수정 — 브라우저 히스토리 처리 개선
    • 코드 블록 하이라이트 처리 실패 시 콘솔 에러와 재처리 문제 완화
  • 개선사항

    • 변경사항 보호(네비게이션 가드) 상태 관리 및 이벤트 처리 신뢰성 향상
    • 에디터 레이아웃 오버플로우 처리 개선으로 레이아웃 안정성 향상
    • 이미지 표시 로직 간소화로 스타일 일관성 개선

@nabbang6 nabbang6 requested review from JIN921, dalzzy and woneeeee April 30, 2026 05:19
@nabbang6 nabbang6 self-assigned this Apr 30, 2026
@nabbang6 nabbang6 added the 🐞 BugFix Something isn't working label Apr 30, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 30, 2026

📝 Walkthrough

Walkthrough

에디터의 빈 콘텐츠 감지 로직 개선, 네비게이션 가드의 ref 기반 리팩토링(이벤트 리스너의 마운트 시 등록 및 히스토리 엔트리 관리 개선), 그리고 취소 버튼의 라우팅 호출을 브라우저 history.back()으로 전환했습니다.

Changes

Cohort / File(s) Summary
에디터 콘텐츠 감지
src/components/board/PostEditorShell.tsx
Tiptap content에서 HTML 태그를 제거해 텍스트 존재 여부(hasText)로 빈 콘텐츠를 판별하도록 변경; 스냅샷 없는 경우 hasChanges 계산에 hasText 사용해 빈 HTML(예: <p></p>)로 인한 오탐 방지.
네비게이션 가드 리팩토링
src/hooks/useNavigationGuard.ts
enabledRef, hasGuardEntry refs 도입으로 이벤트 핸들러가 최신 상태를 읽도록 변경; 리스너는 마운트 시 한 번 등록; popstate 처리 및 guard-entry 삽입/제거 로직 개선(중복 엔트리 방지, 상태 기반 back 스킵).
라우팅 호출 변경
src/components/layout/header/PostingActions.tsx
Next.js useRouter 의존 제거; 취소 동작을 router.back()에서 브라우저 history.back()으로 변경.
에디터 레이아웃 스타일
src/components/board/Editor/index.tsx
루트 컨테이너에 overflow-hidden 클래스 추가로 오버플로우 클리핑 방식 변경.
이미지 카드 스타일 정리
src/components/board/ImageList/ImageCard.tsx
<img> 클래스 지정 간소화(일부 높이/너비 클래스 제거), 업로드되지 않은 상태에 대한 opacity-50 조건 유지.
코드 하이라이트 안전성 강화
src/hooks/useCodeHighlight.ts
이미 하이라이트된 블록을 초기화하고, pre code:not([data-highlighted])만 처리하도록 변경; 각 블록 처리에 try/catch 추가, HTML 비어있음 검사 후 innerHTML 적용 및 data-highlighted 설정.

Sequence Diagram(s)

sequenceDiagram
    participant Browser as 브라우저
    participant Guard as useNavigationGuard
    participant History as History API
    participant App as 애플리케이션

    Note over Guard: 마운트 시 refs 초기화
    Guard->>Guard: enabledRef, hasGuardEntry 설정

    rect rgba(100, 200, 150, 0.5)
    Note over Browser,App: 링크 클릭 / beforeunload
    Browser->>Guard: 클릭/이벤트 발생
    Guard->>Guard: enabledRef.current 확인
    Guard->>History: guard 엔트리 삽입 (조건부)
    Guard->>Guard: hasGuardEntry = true
    end

    rect rgba(100, 150, 200, 0.5)
    Note over Browser,Guard: popstate 처리
    Browser->>Guard: popstate 발생
    Guard->>Guard: 현재 state가 guard 엔트리인지 검사
    alt 엔트리이고 가드 활성화
        Guard->>App: 확인 다이얼로그 표시
    else 가드 비활성화 또는 엔트리 스킵 필요
        Guard->>History: history.back() 호출 (스킵)
        Guard->>Guard: hasGuardEntry = false
    end
    end

    rect rgba(200, 100, 100, 0.5)
    Note over App,Guard: 확인/취소 처리
    App->>Guard: 사용자 확인/취소
    Guard->>Guard: hasGuardEntry = false 설정 및 엔트리 정리
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • JIN921
  • dalzzy

Poem

"나는 토끼, 키보드 위를 깡총,
빈 문단은 숨겨버렸지, 깔끔한 장송.
히스토리는 정리, 노이즈는 스킵,
리팩토링 한 바퀴 돌며 춤을 춰요. 🐇✨"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 변경사항의 주요 목적인 내비게이션 가드 오작동 문제를 명확하게 설명하고 있습니다.
Description check ✅ Passed PR 설명이 저장소의 템플릿을 따르고 있으며, 필수 섹션들(PR 유형, 관련 이슈번호, Key Changes)이 완성되어 있고 실행영상과 스크린샷도 포함되어 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch WTH-363-내비게이션-가드-오작동-문제

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/components/board/PostEditorShell.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/layout/header/PostingActions.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/hooks/useNavigationGuard.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

@github-actions
Copy link
Copy Markdown

구현한 기능 Preview: https://weeth-7wlxfq88k-weethsite-4975s-projects.vercel.app

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/hooks/useNavigationGuard.ts`:
- Around line 31-35: The hook useNavigationGuard currently initializes
hasGuardEntry as a local ref which resets on remount and can miss existing
history guard entries; update the hook to synchronize hasGuardEntry.current with
isGuardEntry() on mount and whenever enabled changes (especially when enabled
=== false initial run) so the hook recognizes existing guard entries across
remounts. Concretely, in useNavigationGuard (references: hasGuardEntry,
allowNavigation, isGuardEntry, enabledRef) call hasGuardEntry.current =
isGuardEntry() inside a useEffect that runs on mount and when enabled changes,
and ensure any early-return logic (the branch that skips guard entry when
disabled) uses that synchronized value so allowNavigation() and subsequent back
navigation behave correctly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 193e18a8-44ef-46dd-bd46-077dcec0cb22

📥 Commits

Reviewing files that changed from the base of the PR and between d23f365 and aafc299.

📒 Files selected for processing (3)
  • src/components/board/PostEditorShell.tsx
  • src/components/layout/header/PostingActions.tsx
  • src/hooks/useNavigationGuard.ts

Comment thread src/hooks/useNavigationGuard.ts
@github-actions
Copy link
Copy Markdown

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/components/board/Editor/index.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/ImageList/ImageCard.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/PostEditorShell.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/layout/header/PostingActions.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/hooks/useNavigationGuard.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

@github-actions
Copy link
Copy Markdown

구현한 기능 Preview: https://weeth-idvwuib3l-weethsite-4975s-projects.vercel.app

Copy link
Copy Markdown
Member

@woneeeee woneeeee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제발............... 이제 그만 수정이 되기를.. .. . . . .. . . .ㅜ.ㅜ 파이팅입니당!!

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/components/board/Editor/index.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/ImageList/ImageCard.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/PostEditorShell.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/layout/header/PostingActions.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/hooks/useCodeHighlight.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

구현한 기능 Preview: https://weeth-jb24hffvo-weethsite-4975s-projects.vercel.app

@github-actions
Copy link
Copy Markdown

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

@github-actions
Copy link
Copy Markdown

🤖 Claude 테스트 제안

모델: claude-sonnet-4-6 | 토큰: 0 입력 / 0 출력

변경된 컴포넌트에 대해 Claude가 생성한 테스트 코드입니다. 검토 후 적합한 부분만 사용하세요.

src/components/board/Editor/index.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/ImageList/ImageCard.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/board/PostEditorShell.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/components/layout/header/PostingActions.tsx

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


src/hooks/useCodeHighlight.ts

오류: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.


이 코멘트는 Claude API를 통해 자동 생성되었습니다. 반드시 검토 후 사용하세요.

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

Jest: 통과

🎉 모든 테스트를 통과했습니다!

@github-actions
Copy link
Copy Markdown

구현한 기능 Preview: https://weeth-9gaa7rkli-weethsite-4975s-projects.vercel.app

@github-actions
Copy link
Copy Markdown

PR 검증 결과

TypeScript: 통과
ESLint: 통과
Prettier: 통과
Build: 통과

🎉 모든 검증을 통과했습니다!

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
src/components/board/ImageList/ImageCard.tsx (1)

50-56: ⚡ Quick win

<img> 대신 next/image로 전환해 주세요

이 블록은 여전히 네이티브 <img>와 lint disable에 의존하고 있습니다. 이번 변경 범위(이미지 카드 렌더링)에서 next/image로 맞춰 두는 게 좋습니다.

제안 diff
+import Image from 'next/image';
 import { CloseCircleIcon } from '@/assets/icons';
 import { Icon } from '@/components/ui';
 import { cn } from '@/lib/cn';
 import type { DisplayFile } from '@/types/board';
@@
-      {/* eslint-disable-next-line `@next/next/no-img-element` */}
-      <img
+      <Image
         src={item.fileUrl}
         alt={item.fileName}
+        fill
+        sizes="(max-width: 768px) 100vw, 33vw"
         draggable={false}
         className={cn('object-cover', item.uploaded === false && 'opacity-50', imgClassName)}
       />

As per coding guidelines, **/*.{ts,tsx}: Use next/image for image optimization and next/font for font loading.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/board/ImageList/ImageCard.tsx` around lines 50 - 56, The
ImageCard component still uses a raw <img> with an eslint-disable; replace it
with Next.js Image from 'next/image' to comply with project rules: import Image
and use it in place of the <img>, passing item.fileUrl as src, item.fileName as
alt, draggable={false} behavior via onDragStart preventDefault or draggable prop
if supported, and apply classes via className (preserve cn('object-cover',
item.uploaded === false && 'opacity-50', imgClassName)); ensure image
layout/width/height or fill is set per Next/Image requirements and keep the
existing imgClassName and uploaded opacity logic.
src/hooks/useCodeHighlight.ts (2)

46-51: 💤 Low value

Static analysis 경고 검토: innerHTML 할당

Static analysis에서 XSS 위험으로 플래그되었지만, 현재 코드는 안전합니다:

  1. 상위 컴포넌트(PostCardBody)에서 이미 DOMPurify.sanitize()로 콘텐츠를 정제
  2. codeEl.textContent는 순수 텍스트만 반환 (HTML 태그 제거됨)
  3. toHtml()은 HAST를 HTML로 변환 시 텍스트 노드를 적절히 이스케이프

미래 유지보수자를 위해 이 안전성 근거를 주석으로 명시하면 좋겠습니다.

📝 안전성 주석 추가 제안
       const html = toHtml(result);
 
       if (!html || html.trim() === '') return;
 
+      // 안전: textContent는 HTML 태그를 제외한 순수 텍스트만 반환하고,
+      // toHtml()은 텍스트 노드를 적절히 이스케이프함
       codeEl.innerHTML = html;
       codeEl.setAttribute('data-highlighted', '');
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/hooks/useCodeHighlight.ts` around lines 46 - 51, Add a concise inline
comment near the innerHTML assignment in useCodeHighlight explaining why this
use of codeEl.innerHTML is safe: note that the source content is already
sanitized in the parent PostCardBody via DOMPurify.sanitize, that
codeEl.textContent returns only text nodes, and that toHtml (used to convert
HAST to HTML) properly escapes text nodes—mention these specific symbols
(useCodeHighlight, toHtml, PostCardBody, DOMPurify.sanitize, codeEl.textContent,
codeEl.innerHTML) so future maintainers understand the sanitization chain and
why the XSS static-analysis warning can be safely ignored.

24-25: 💤 Low value

중복 체크 로직 확인 필요

Line 15-17에서 모든 data-highlighted 속성을 먼저 제거하고, line 19에서 :not([data-highlighted]) 셀렉터로 요소를 선택합니다. 따라서 이 forEach 루프 내에서 codeEl.hasAttribute('data-highlighted')는 항상 false가 됩니다.

실질적인 중복 처리 방지는 line 22의 span 체크가 담당하고 있습니다. 이 조건은 방어적 코드로 남겨둘 수 있지만, 의도가 있다면 주석으로 명시하면 좋겠습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/hooks/useCodeHighlight.ts` around lines 24 - 25, The duplicate-guard
check inside useCodeHighlight's forEach loop (the
codeEl.hasAttribute('data-highlighted') check) is redundant because earlier
logic removes all data-highlighted attributes and then selects elements with
:not([data-highlighted]), so that condition will never be true; either remove
that check to simplify the loop or keep it but add a clear comment next to the
codeEl.hasAttribute('data-highlighted') check explaining it is intentionally
defensive (reference symbols: useCodeHighlight, codeEl, the forEach loop and the
earlier :not([data-highlighted]) selection) so future readers understand why it
remains.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/components/board/ImageList/ImageCard.tsx`:
- Around line 50-56: The ImageCard component still uses a raw <img> with an
eslint-disable; replace it with Next.js Image from 'next/image' to comply with
project rules: import Image and use it in place of the <img>, passing
item.fileUrl as src, item.fileName as alt, draggable={false} behavior via
onDragStart preventDefault or draggable prop if supported, and apply classes via
className (preserve cn('object-cover', item.uploaded === false && 'opacity-50',
imgClassName)); ensure image layout/width/height or fill is set per Next/Image
requirements and keep the existing imgClassName and uploaded opacity logic.

In `@src/hooks/useCodeHighlight.ts`:
- Around line 46-51: Add a concise inline comment near the innerHTML assignment
in useCodeHighlight explaining why this use of codeEl.innerHTML is safe: note
that the source content is already sanitized in the parent PostCardBody via
DOMPurify.sanitize, that codeEl.textContent returns only text nodes, and that
toHtml (used to convert HAST to HTML) properly escapes text nodes—mention these
specific symbols (useCodeHighlight, toHtml, PostCardBody, DOMPurify.sanitize,
codeEl.textContent, codeEl.innerHTML) so future maintainers understand the
sanitization chain and why the XSS static-analysis warning can be safely
ignored.
- Around line 24-25: The duplicate-guard check inside useCodeHighlight's forEach
loop (the codeEl.hasAttribute('data-highlighted') check) is redundant because
earlier logic removes all data-highlighted attributes and then selects elements
with :not([data-highlighted]), so that condition will never be true; either
remove that check to simplify the loop or keep it but add a clear comment next
to the codeEl.hasAttribute('data-highlighted') check explaining it is
intentionally defensive (reference symbols: useCodeHighlight, codeEl, the
forEach loop and the earlier :not([data-highlighted]) selection) so future
readers understand why it remains.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 767201b1-cbf7-4f7e-8b1f-99f7adb5204b

📥 Commits

Reviewing files that changed from the base of the PR and between aafc299 and f3ef03f.

📒 Files selected for processing (4)
  • src/components/board/Editor/index.tsx
  • src/components/board/ImageList/ImageCard.tsx
  • src/hooks/useCodeHighlight.ts
  • src/hooks/useNavigationGuard.ts
✅ Files skipped from review due to trivial changes (1)
  • src/components/board/Editor/index.tsx

@nabbang6 nabbang6 merged commit 0448ae5 into develop Apr 30, 2026
5 checks passed
@nabbang6 nabbang6 deleted the WTH-363-내비게이션-가드-오작동-문제 branch May 3, 2026 08:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐞 BugFix Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants