|
// TypeSet.cpp: implementation of the CTypeset class." O6 ]; P. S- [' p- k" F% Z$ V //* V0 D* H, f; ^7 A9 F3 c- s ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "..\INC\TypeSet.h"; N: E# U6 b8 E, N9 a //用法示例6 A( H4 o9 m" Q void TestTypeset(HDC dc) {4 l% C2 ?% H, Y8 \* D0 ] //声明一个板材对象 CTypeset typeset; //设置板材对象大小 typeset.m_Desktop.m_dHeight=9999; Q( N: V+ ?1 d. C9 W typeset.m_Desktop.m_dWidth=100;* z5 Q5 t/ {8 f4 ?) f+ l5 P+ w+ r //声明一个排样元素对象3 z0 I' [ ]/ @" D. E/ W* D! c CMaterial material; //设置排样元素对象大小 material.SetSize(20,99); //添加进入板材对象 typeset.Add(&material); //继续添加 material.SetSize(99,80); typeset.Add(&material);3 c2 _) o' m" V/ f material.SetSize(10,60); typeset.Add(&material);6 O$ y: X @6 G# ^9 |; B' f material.SetSize(50,20);) k7 T6 J! s# m typeset.Add(&material); //添加完毕,进行排样; R/ P o/ b6 G. P1 ` c( k/ v typeset.Go();. S. D' C7 }8 g/ \+ |& u //排样完毕,输出 list<CMaterial*>::iterator iter;) [. ]6 s5 Q" r* V* K* s; I" t //画板材对象. K9 `, k. y% h1 ~5 q ::Rectangle(dc,typeset.m_Desktop.m_dX,typeset.m_Desktop.m_dY,# y4 y' `) f2 c) ~8 d4 l9 M typeset.m_Desktop.m_dX+typeset.m_Desktop.m_dWidth,# n; |2 _8 `% t/ V8 f9 V typeset.m_Desktop.m_dY+typeset.m_Desktop.m_dHeight); //画排样元素对象2 d; V4 V8 p6 m8 z for(iter=typeset.m_MaterialList.begin();iter!=typeset.m_MaterialList.end();iter++) {. |7 A# c& z+ v- Q: s" `6 z ::Rectangle(dc,(*iter)->m_dX,(*iter)->m_dY, a+ T# v6 q" c2 M& S (*iter)->m_dX+(*iter)->m_dWidth, (*iter)->m_dY+(*iter)->m_dHeight);" C1 w4 m9 O7 h* S+ ~0 l) a# _7 @1 `1 r; h }) }' @: w) j- e5 I' Y3 D 5 `# y# q1 I7 _ } ////////////////////////////////////////////////////////////////////// // CMaterial Class ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////4 j, F4 H {) w* Y // Construction/Destruction //////////////////////////////////////////////////////////////////////. \0 n: U7 Y! K' F- u: Z/ Y #define ZERO 0.00001 CMaterial::CMaterial(). p$ X& e! u! y; Q7 K4 @6 y { m_dHeight=100; m_dWidth=100;4 u1 F- e2 H! R) W9 c m_dX=0;- }' `! H' N% x. f/ U5 s4 q5 \ m_dY=0; m_bUsed=FALSE; m_bSeletcted=FALSE;7 W; y4 H6 c* k; n: Y5 X m_bRotated=FALSE; m_iIndex=0; } CMaterial::CMaterial(double dWidth,double dHeight) {9 C+ {; E! _1 d7 g# p SetSize(dWidth,dHeight); m_dX=0;+ V! ? m e) T4 _" U2 q m_dY=0;6 k! j3 o* B- [$ |! z8 Y) @ m_bUsed=FALSE; m_bSeletcted=FALSE; m_bRotated=FALSE; m_iIndex=0; }) D# d' G/ y- I. a6 G CMaterial::CMaterial(CMaterial *pMaterial) { m_dX=pMaterial->m_dX;3 a* \) b, z$ } m_dY=pMaterial->m_dY;/ i3 } P P% v& b m_dHeight=pMaterial->m_dHeight;) i4 E" g& w: t5 \) X. W m_dWidth=pMaterial->m_dWidth;6 u, L# l$ M w6 V* J m_bUsed=pMaterial->m_bUsed;; Q/ f! ` ~& g/ Q7 y m_bSeletcted=pMaterial->m_bSeletcted; m_bRotated=pMaterial->m_bRotated; m_iIndex=pMaterial->m_iIndex; } void CMaterial::SetSize(double dWidth, double dHeight) { m_dHeight=dHeight; m_dWidth=dWidth; } void CMaterial::Rotated()% W' Y2 j2 f% E8 O( Q: Z {( X3 z2 a' |. F5 h- G m_bRotated=!m_bRotated; double dA=m_dHeight;, ^% I; ^3 P7 f. X s% x m_dHeight=m_dWidth;$ {( a- f. N4 }9 s m_dWidth=dA;* y; M' T3 i) o; T } CMaterial::~CMaterial()$ {: X2 e% R, J. S" ]: g4 R6 F { }, ]7 K/ H* k U# Z& O3 p9 T# d //////////////////////////////////////////////////////////////////////5 j7 b9 Z, o+ P- n // Construction/Destruction& P: e# B1 E& O0 I ////////////////////////////////////////////////////////////////////// CTypeset::CTypeset()6 y% p4 }5 ]5 f$ c2 g { Clear();3 H' k' p4 c# B9 G5 t- v' u } CTypeset::~CTypeset()( R0 H% L0 r. x% l ~! B+ B { Clear(); ) y9 P, t7 Q& [- _4 Q' o" S }( F% m/ d7 a5 n5 j9 w1 d7 j , ?+ S/ i' w8 B void CTypeset::Clear() { list<CMaterial*>::iterator iter;0 T6 b6 U9 L: Y+ X0 o# s. D for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)9 P0 E5 M% y, F- Z9 L2 _ {% m+ o: J) j2 Q. ?% P* g6 g delete (*iter); }- \* p) T) w& O C# O2 G: p m_MaterialList.clear();# D/ T% F! d! F3 U) J0 R3 h m_iCurIndex=0; } void CTypeset::Add(CMaterial *pMaterial) P) o6 I& D) t, A3 ?& U { CMaterial *p=new CMaterial(pMaterial); |
精华推荐
换一换


p->m_iIndex=m_iCurIndex;6 d; e- C' Y# N9 y% N
m_MaterialList.insert(m_MaterialList.end(),p);
m_iCurIndex++;" q0 o' y9 q6 b( n% }$ d B
}
# [, F2 T, u# H6 ?/ m
void CTypeset::Sort()( Z5 c1 Y; I4 ~ A0 A J
{2 n- @7 f3 C7 k* v- t; @% D
list<CMaterial*> MaterialList;+ `2 `8 `/ {0 V
list<CMaterial*>::iterator iter1,iter2,iter3;
bool bSourceInvert=false;
while (!m_MaterialList.empty())$ N3 \: q& q z: a& W
{0 R, w5 X$ M% p- p5 p
double dMaxLen=0;
iter2=m_MaterialList.begin();
CMaterial *p=NULL;
iter1=m_MaterialList.end()--;
iter3=iter2;
while(iter2!=iter1)
{
if((*iter2)->m_dWidth>dMaxLen)
{
p=*iter2;0 r3 O+ B4 H5 r7 B( o
iter3=iter2;
dMaxLen=(*iter2)->m_dWidth;
bSourceInvert=false;8 C9 r* ~+ q$ `9 Z6 R& k
}
if((*iter2)->m_dHeight>dMaxLen)
{
p=*iter2;
iter3=iter2;
dMaxLen=(*iter2)->m_dHeight;
bSourceInvert=true;
}
iter2++;
}
if(p!=NULL)& h/ o" x$ @2 w+ A3 D& Y$ z$ w
{
if(bSourceInvert)
p->Rotated(); 6 C% J, ^; m) V2 m0 H: i% `
MaterialList.insert(MaterialList.end(),p);
m_MaterialList.erase(iter3);' V0 O& }) a, ?# i, m3 i' a N
}
}7 f0 }' m5 S9 d) \$ K! O% h
m_MaterialList.clear();
for(iter1=MaterialList.begin();iter1!=MaterialList.end();iter1++)
{5 }6 d! R: r" W. K+ F+ J. u
m_MaterialList.insert(m_MaterialList.end(),(*iter1));
}
MaterialList.clear();5 j: ~ p& I& U/ B- ~
}
double CTypeset::Go()9 F P" ~+ ~$ C* u6 U: ?( D# Y
{
double dRet=0;) s8 J0 i i7 l8 w; U E/ ^
list<CMaterial*> List;
list<CMaterial*>::iterator iter;. ?9 v, e' p3 S( {
Sort();
Typeset(m_Desktop.m_dX,m_Desktop.m_dY,# z, l5 @9 T9 f9 k2 S6 g' e1 F" W6 f+ ]
m_Desktop.m_dWidth,m_Desktop.m_dHeight,&List);6 O" ?5 A0 s8 B% z
m_MaterialList.clear();" ^& Z5 e$ X o2 D* [3 ^) Q9 \0 s6 _
for(iter=List.begin();iter!=List.end();iter++)2 \; X$ |* A0 y0 W
{4 T: A, \* X4 l3 I% h% e, y7 q
if((*iter)->m_dX<ZERO)
{' ]( J' P( k' x
dRet+=(*iter)->m_dY;! I& P! J" T3 x P# Q
}& t4 ]" \: w/ ?- S. |. C, S4 p
(*iter)->m_bUsed=FALSE;
(*iter)->m_bSeletcted=FALSE;
m_MaterialList.insert(m_MaterialList.end(),(*iter));) o, y1 M" C2 A
} I0 R& s% @7 m
List.clear();
return dRet;
}
double CTypeset::Typeset(double dStartX,double dStartY,double dStartHei,double dStartWid,: R& O' [2 [# Y5 `
list<CMaterial*> *pList)
{$ b- {: l& J# j5 y9 c5 ]
CMaterial *tmpunit=NULL;
list<CMaterial*>::iterator iter,iter1;
double dArea1,dArea2,dArea;//横放和竖放时的排样面积,和最后方案的排样面积, a- t* l! }6 C
double dRestArea1,dRestArea2;//横放和竖放时排样后的剩余面积
list<CMaterial*> List1,List2;////横放和竖放时的最佳排样序列! E4 Q. l7 M! R3 X6 z/ n; L' K
double dHeight,dWidth;, f! W4 f6 Q0 P- ~8 |
dHeight=dStartHei;2 c9 E! H. A3 g6 n f
dWidth=dStartWid;
if(m_MaterialList.empty())
return 0;
for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)
{
if((*iter)->m_bUsed!=FALSE)! }4 M; u" T/ A3 l4 ~" g4 n: a' b) s
continue;
if((*iter)->m_dWidth<(*iter)->m_dHeight)
{! ^ p5 n4 g: \
MessageBox(NULL,"错误","ERROR",MB_OK);
return 0;
}
//找出一张能放入的最大的没有排过的板材
//如果板材横竖都能放入0 Z: Y; N( a( f7 z- |' ~
if(((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO))) f# v; @' S0 n) @0 A4 L
&&((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO)))
{
if(dStartX<ZERO): \( Z5 ]2 N7 u. w
dWidth=(*iter)->m_dHeight;
(*iter)->SetUsed(TRUE);//对该图排样
//先横着放入继续排样,计算剩余面积" i& A2 R4 [2 f" ~5 F6 p
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1);5 W4 K( A# y/ f$ l
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();9 \6 q. t. P( G8 d6 D- t/ d
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率
//将刚才排过的板材状态还原,再竖直放入该图继续排样,计算剩余面积: x: z% E/ a, _' j) B! H- r/ v
if(dStartX<ZERO)
dWidth=(*iter)->m_dWidth;- S$ H$ j% L3 B) ]
# @9 R! ~$ y [1 y; E2 V9 n% X
SetStatus(&List1,FALSE);
tmpunit=(*iter)->Copy();
tmpunit->Rotated();
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);* |0 o, `2 Y+ D6 n6 l4 p: x6 D
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();' Q" U3 l- K( E! W/ F2 ?3 F; R( [
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率3 X6 J1 x& `. q2 P$ K
}
else if((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO))//如果板材只能横着放入
{3 J, B/ f8 B) `2 N8 d
if(dStartX<ZERO), L' ~) | c% J4 X {' A
dWidth=(*iter)->m_dHeight;
/ ^2 i" H' }5 g5 W, ^9 K
(*iter)->SetUsed(TRUE);//对该图排样) f' F+ O& L- D: C* U1 h* ~
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1); Y6 |3 U! V% e }- j- w2 ]
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();& O" i L) x: U* _) z
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率6 R: A Q. u0 \: ~8 Y- N$ V
7 Q% r9 e' @' T: q
dRestArea2=dRestArea1+10;//不再尝试竖放,将竖放剩余面积设大. d# v8 k3 h" o
}. J: J! h2 I1 y. B- I/ H
else if((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO))//如果板材只能竖着放入
{
if(dStartX<ZERO)
dWidth=(*iter)->m_dWidth;2 G) Z; d6 S1 ?/ s8 F. f+ ?
. K& g: t( w$ N g7 k6 A6 t! f
(*iter)->SetUsed(TRUE);//对该图排样5 a5 ^3 {( `: @
tmpunit=(*iter)->Copy();
tmpunit->Rotated();
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,2 f) Q$ N/ n2 `/ ^- P$ u
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率& f+ g* |# R; U" Y0 d/ ?! u
dRestArea1=dRestArea2+10;//不再尝试横放,将横放剩余面积设大1 {: O" i7 N; j# F& s
}
else 9 o5 ?% O5 P7 a; T* R
continue;5 Q; X/ O5 f1 }8 d z
//记录优化的排样序列7 m" ~9 b3 P; J4 g
CMaterial *tmp=NULL;9 D+ ]) m9 Q2 J5 e+ I; K, Y( |
if(dRestArea1<dRestArea2+ZERO)//当前板材横向排结果优化0 V5 k# c3 D! @8 @; T
{
SetStatus(&List2,FALSE);//将纵向排的排样序列还原状态7 l) r5 X J4 }( A, d( y
SetStatus(&List1,TRUE);//将横向排的排样序列标志为使用
dArea=dArea1+(*iter)->GetArea();;. r1 S3 T, I9 L5 S- I/ I
tmp=(*iter)->Copy();
tmp->m_dX=(int)dStartX;
tmp->m_dY=(int)dStartY;
pList->insert(pList->end(),tmp);9 ^/ ]- o( s, c1 A
while(!List1.empty())8 m) o1 L! j* z% \0 ]1 W. |7 A( Q
{0 o# S% a9 m* Z5 ?. q& e
iter1=List1.begin();9 q1 M: \: q' d$ k
pList->insert(pList->end(),*iter1);
List1.erase(iter1);9 V/ {& r; U" c
}
//释放不好的序列
for(iter1=List2.begin();iter1!=List2.end();iter1++)" g B g7 P( i7 m
{) z/ h+ y/ H, h: E* A* t2 U
delete (*iter1);
}
List2.clear();7 r# a5 E0 k+ }8 ^$ V
delete tmpunit;
}
else//当前板材纵向排结果优化
{$ k3 k f! \$ y( T
SetStatus(&List1,FALSE);//将横向排的排样序列还原状态
SetStatus(&List2,TRUE);//将纵向排的排样序列标志为使用! u; @, [' \4 i2 \1 f1 s
if(tmpunit==NULL)* j% @: P3 }3 b( \, U
{
MessageBox(NULL,"错误","ERROR",MB_OK);: }$ G1 G1 @: w" m) X" i
return 0;
}
" j4 X9 z# H- a% x% \
dArea=dArea2+(*iter)->GetArea();
tmp=tmpunit->Copy();
tmp->m_dX=(int)dStartX;
tmp->m_dY=(int)dStartY;8 s [* \/ _: u/ v+ L4 x+ Q& x
pList->insert(pList->end(),tmp);
while(!List2.empty())
{* B) l3 I! F/ v0 [5 W" J
iter1=List2.begin();
pList->insert(pList->end(),*iter1);
List2.erase(iter1);0 J- n J2 N: D5 F/ z/ h: b! q6 u
}# G9 ]* F/ p$ k F# |" N' D, ]% s2 G
//释放不好的序列
for(iter1=List1.begin();iter1!=List1.end();iter1++)3 g9 L+ }, Y$ v
{
delete (*iter1);* a" M9 f3 d7 D
}
List1.clear();
delete tmpunit;" i, @% E' s. l; t
}
double next_x,next_y,next_len,next_wid;
next_x=dStartX;6 c- a& d: n8 p+ o: r8 ]+ R
next_y=dStartY+tmp->m_dHeight;
next_len=dHeight;
next_wid=dStartWid-tmp->m_dHeight;
if(next_wid>ZERO)//板材还有剩余6 u, e: f4 p0 a1 K4 V* [4 h
{0 T( a! j" f# B, V
//继续排下一行- T: Z7 ~% G h2 m( y6 k
dArea=dArea+Typeset(next_x,next_y,next_len,next_wid,&List1);! } Q: W/ l9 x U, [) j
//记录排样序列
SetStatus(&List1,TRUE);0 ~1 [7 u/ T/ I7 A! {* y
for(iter1=List1.begin();iter1!=List1.end();iter1++)# ]9 J5 [6 h7 `8 ?3 I
{
pList->insert(pList->end(),(*iter1));
}0 X$ `4 [7 Q- C" \( n! G
List1.clear();) Y% n2 `9 R: }9 Z% ^7 Y
}
return dArea;' \7 s. S1 o4 Y; G& X
}3 W1 E$ F1 Y! j1 X' J4 d' ?- S$ V. j# E
return 0;* B; @( {" S2 O& J
}' Q2 o6 i% f: t. a! ]
% {3 U* w0 g6 K! y' s
void CMaterial::SetUsed(BOOL bUsed)
{
m_bUsed=bUsed;6 V* ^* G; x* s" |7 }: n6 O
}& c) n8 f3 ]: ?, Q) }, E+ e+ U
void CTypeset::SetStatus(list<CMaterial*> *pList, BOOL bUsed)& D0 ~6 i' f7 |! N: V# I+ z
{
list<CMaterial*>::iterator iter1,iter2;$ m" V! B$ F1 w1 m2 D" g$ r" _
for(iter1=m_MaterialList.begin();iter1!=m_MaterialList.end();iter1++)
{) G- l0 j9 m, m# r9 k- h" i
for(iter2=pList->begin();iter2!=pList->end();iter2++)- |( f; u% ~: z- H# |) G
{
if((*iter1)->m_iIndex==(*iter2)->m_iIndex)7 G% o8 J! s8 U, h8 I& H. d8 D
{) Y5 k& Z& b, I' e: X
(*iter1)->m_bUsed=bUsed;2 S* @& T3 X4 x( r( L) ]
}' L8 m& {6 @+ B1 H' l
}
}
}5 [) ~2 p: f' u- @% b, k- _
CMaterial* CMaterial::Copy()/ O) K4 e4 F, i) e- K/ t4 |8 [
{- p6 K G$ C4 i! q4 c5 h* D: f) W
CMaterial* p=new CMaterial(this);0 P0 ?3 I' ?; t$ `/ K. @ T& c
return p;
}
4 s+ n1 N$ `! Z! M
// TypeSet.h: interface for the CTypeset class.8 z$ [6 {# C+ g9 G2 E
//
//////////////////////////////////////////////////////////////////////6 ~- c7 u5 \& p5 w, L) `$ S' C7 z
/ F# U/ d& n% t; ?8 M; D" @, b# Q
#if !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)5 Y( p" n; ^3 a; x l0 K2 j
#define AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_
#if _MSC_VER > 10001 G# H, S/ M1 [+ l& R
#pragma once8 H0 y: R$ {2 ^+ U
#endif // _MSC_VER > 1000
#pragma warning(disable:4786)
#pragma warning(disable:4251)- a! X1 \9 X! ^6 i$ e; p; O0 |4 U
#include <list>) N6 T$ p) t2 g- W5 n+ y# K8 `; M
#include <string>
using namespace std;
( D" a, X0 j J, Z/ r6 P: M# l' w/ \
#ifdef TYPESETLIB_EXPORTS" o: o! M+ V. b
#define TYPESETLIB_API __declspec(dllexport)" `, P5 M% Y5 h3 e# ^3 ^
#else3 L6 T* H2 w" }3 @2 a
#define TYPESETLIB_API __declspec(dllimport)
#endif, u7 }* k. p% M7 f3 W
TYPESETLIB_API void TestTypeset(HDC dc);
class TYPESETLIB_API CMaterial
{; B& h7 A( F" K, ]" o5 N
public:7 ~$ W# F3 c5 Y, K( ^
virtual CMaterial* Copy();
virtual void SetUsed(BOOL bUsed);
virtual void Rotated();$ w3 y# C* B: K e4 L$ w: s! n
virtual void SetSize(double dWidth,double dHeight);
virtual double GetArea(){ return m_dHeight*m_dWidth; }
CMaterial();
CMaterial(CMaterial *pMaterial);4 ?/ x4 Z0 y- U4 y8 w, b
CMaterial(double dWidth,double dHeight);
virtual ~CMaterial();
double m_dHeight,m_dWidth;$ T. h2 W/ ~' ^. t6 a
double m_dX,m_dY;
BOOL m_bUsed;9 B6 q+ X! r% {3 W
BOOL m_bSeletcted;
BOOL m_bRotated;! u( V' T! ~5 e8 q. q
int m_iIndex;
! ]8 c/ G& b, g( w0 _
};5 V1 O* H" L% t4 U7 k! k7 |: K
class TYPESETLIB_API CTypeset
{
public:2 W/ ^, L% p7 V$ q4 u& o
virtual double Go();! l* a" C$ G! K5 `) H
virtual void Add(CMaterial *pMaterial);2 O% |4 {# B2 |: J
CTypeset();/ q- }% P8 w2 {" C$ M
virtual ~CTypeset();8 N g2 n( h2 \' d& W( o8 I& g
list<CMaterial*> m_MaterialList;5 `6 {4 |. }' }& z7 B/ `$ i5 ~( `
CMaterial m_Desktop;" N$ }0 }: o% o1 G1 z/ V
protected:
virtual void SetStatus(list<CMaterial*> *pList, BOOL bUsed);% I; t* H7 ]3 m+ |' p; ~
virtual double Typeset(double dStatrX,double dStatrY,double dStatrHei,double dStatrWid,
list<CMaterial*> *pList);
virtual void Sort();
virtual void Clear();
int m_iCurIndex;$ M( c2 I7 p3 v
};0 t6 x" U, {2 K$ E7 }
& ~1 v* L% @6 i* ^) Z# l- D$ B
#endif // !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)